1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-02-03 13:01:33 +02:00

Added new settings to Launcher:

- UI Scaling selection
- Allied AI selection
- Separate main/secondary mod repo
This commit is contained in:
Ivan Savenko 2023-06-29 15:41:12 +03:00
parent 814a4b9455
commit 21c45bd84f
6 changed files with 501 additions and 392 deletions

View File

@ -270,7 +270,7 @@
"type" : "object",
"additionalProperties" : false,
"default" : {},
"required" : [ "server", "port", "localInformation", "playerAI", "friendlyAI","neutralAI", "enemyAI", "reconnect", "uuid", "names" ],
"required" : [ "server", "port", "localInformation", "playerAI", "alliedAI", "friendlyAI", "neutralAI", "enemyAI", "reconnect", "uuid", "names" ],
"properties" : {
"server" : {
"type" : "string",
@ -288,6 +288,10 @@
"type" : "string",
"default" : "Nullkiller"
},
"alliedAI" : {
"type" : "string",
"default" : "VCAI"
},
"friendlyAI" : {
"type" : "string",
"default" : "BattleAI"
@ -397,16 +401,37 @@
"type" : "object",
"default" : {},
"additionalProperties" : false,
"required" : [ "setupCompleted", "repositoryURL", "enableInstalledMods", "autoCheckRepositories", "updateOnStartup", "updateConfigUrl", "lobbyUrl", "lobbyPort", "lobbyUsername", "connectionTimeout" ],
"required" : [
"setupCompleted",
"defaultRepositoryEnabled",
"defaultRepositoryURL",
"extraRepositoryURL",
"extraRepositoryEnabled",
"enableInstalledMods",
"autoCheckRepositories",
"updateOnStartup",
"updateConfigUrl",
"lobbyUrl",
"lobbyPort",
"lobbyUsername",
"connectionTimeout"
],
"properties" : {
"repositoryURL" : {
"type" : "array",
"default" : [
"https://raw.githubusercontent.com/vcmi/vcmi-mods-repository/develop/vcmi-1.3.json"
],
"items" : {
"type" : "string"
}
"defaultRepositoryEnabled" : {
"type" : "boolean",
"default" : true,
},
"defaultRepositoryURL" : {
"type" : "string",
"default" : "https://raw.githubusercontent.com/vcmi/vcmi-mods-repository/develop/vcmi-1.3.json",
},
"extraRepositoryEnabled" : {
"type" : "boolean",
"default" : false,
},
"extraRepositoryURL" : {
"type" : "string",
"default" : "",
},
"setupCompleted" : {
"type" : "boolean",

View File

@ -90,11 +90,8 @@ void CModListView::setupModsView()
CModListView::CModListView(QWidget * parent)
: QWidget(parent)
, settingsListener(settings.listen["launcher"]["repositoryURL"])
, ui(new Ui::CModListView)
, repositoriesChanged(false)
{
settingsListener([&](const JsonNode &){ repositoriesChanged = true; });
ui->setupUi(this);
setupModModel();
@ -128,15 +125,25 @@ CModListView::CModListView(QWidget * parent)
void CModListView::loadRepositories()
{
manager->resetRepositories();
for(auto entry : settings["launcher"]["repositoryURL"].Vector())
QStringList repositories;
if (settings["launcher"]["defaultRepositoryEnabled"].Bool())
repositories.push_back(QString::fromStdString(settings["launcher"]["defaultRepositoryURL"].String()));
if (settings["launcher"]["extraRepositoryEnabled"].Bool())
repositories.push_back(QString::fromStdString(settings["launcher"]["extraRepositoryURL"].String()));
for(auto entry : repositories)
{
QString str = QString::fromUtf8(entry.String().c_str());
if (entry.isEmpty())
continue;
// URL must be encoded to something else to get rid of symbols illegal in file names
auto hashed = QCryptographicHash::hash(str.toUtf8(), QCryptographicHash::Md5);
auto hashed = QCryptographicHash::hash(entry.toUtf8(), QCryptographicHash::Md5);
auto hashedStr = QString::fromUtf8(hashed.toHex());
downloadFile(hashedStr + ".json", str, "repository index");
downloadFile(hashedStr + ".json", entry, "repository index");
}
}
@ -148,19 +155,6 @@ CModListView::~CModListView()
delete ui;
}
void CModListView::showEvent(QShowEvent * event)
{
QWidget::showEvent(event);
if(repositoriesChanged)
{
repositoriesChanged = false;
if(settings["launcher"]["autoCheckRepositories"].Bool())
{
loadRepositories();
}
}
}
static QString replaceIfNotEmpty(QVariant value, QString pattern)
{
if(value.canConvert<QStringList>())

View File

@ -35,11 +35,6 @@ class CModListView : public QWidget
CModFilterModel * filterModel;
CDownloadManager * dlManager;
SettingsListener settingsListener;
bool repositoriesChanged;
void showEvent(QShowEvent * event) override;
void setupModModel();
void setupFilterModel();
void setupModsView();

View File

@ -79,22 +79,25 @@ void CSettingsView::loadSettings()
else
ui->comboBoxFullScreen->setCurrentIndex(settings["video"]["fullscreen"].Bool());
#endif
ui->spinBoxInterfaceScaling->setValue(settings["video"]["resolution"]["scaling"].Float());
ui->comboBoxFriendlyAI->setCurrentText(QString::fromStdString(settings["server"]["friendlyAI"].String()));
ui->comboBoxNeutralAI->setCurrentText(QString::fromStdString(settings["server"]["neutralAI"].String()));
ui->comboBoxEnemyAI->setCurrentText(QString::fromStdString(settings["server"]["enemyAI"].String()));
ui->comboBoxPlayerAI->setCurrentText(QString::fromStdString(settings["server"]["playerAI"].String()));
ui->comboBoxEnemyPlayerAI->setCurrentText(QString::fromStdString(settings["server"]["playerAI"].String()));
ui->spinBoxNetworkPort->setValue(settings["server"]["port"].Integer());
ui->comboBoxAutoCheck->setCurrentIndex(settings["launcher"]["autoCheckRepositories"].Bool());
JsonNode urls = settings["launcher"]["repositoryURL"];
ui->plainTextEditRepos->blockSignals(true); // Do not report loading as change of data
ui->plainTextEditRepos->clear();
for(auto entry : urls.Vector())
ui->plainTextEditRepos->appendPlainText(QString::fromUtf8(entry.String().c_str()));
ui->plainTextEditRepos->blockSignals(false);
ui->lineEditRepositoryDefault->setText(QString::fromStdString(settings["launcher"]["defaultRepositoryURL"].String()));
ui->lineEditRepositoryExtra->setText(QString::fromStdString(settings["launcher"]["extraRepositoryURL"].String()));
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());
ui->lineEditUserDataDir->setText(pathToQString(VCMIDirs::get().userDataPath()));
ui->lineEditGameDir->setText(pathToQString(VCMIDirs::get().binaryPath()));
@ -254,24 +257,6 @@ void CSettingsView::on_spinBoxNetworkPort_valueChanged(int arg1)
node->Float() = arg1;
}
void CSettingsView::on_plainTextEditRepos_textChanged()
{
Settings node = settings.write["launcher"]["repositoryURL"];
QStringList list = ui->plainTextEditRepos->toPlainText().split('\n');
node->Vector().clear();
for(QString line : list)
{
if(line.trimmed().size() > 0)
{
JsonNode entry;
entry.String() = line.trimmed().toUtf8().data();
node->Vector().push_back(entry);
}
}
}
void CSettingsView::on_openTempDir_clicked()
{
QDesktopServices::openUrl(QUrl::fromLocalFile(QFileInfo(ui->lineEditTempDir->text()).absoluteFilePath()));
@ -293,11 +278,6 @@ void CSettingsView::on_comboBoxShowIntro_currentIndexChanged(int index)
node->Bool() = index;
}
void CSettingsView::on_changeGameDataDir_clicked()
{
}
void CSettingsView::on_comboBoxAutoSave_currentIndexChanged(int index)
{
Settings node = settings.write["general"]["saveFrequency"];
@ -441,3 +421,31 @@ void CSettingsView::on_comboBoxLanguageBase_currentIndexChanged(int index)
QString selectedLanguage = ui->comboBoxLanguageBase->itemData(index).toString();
node->String() = selectedLanguage.toStdString();
}
void CSettingsView::on_checkBoxRepositoryDefault_stateChanged(int arg1)
{
Settings node = settings.write["launcher"]["defaultRepositoryEnabled"];
node->Bool() = arg1;
ui->lineEditRepositoryDefault->setEnabled(arg1);
}
void CSettingsView::on_checkBoxRepositoryExtra_stateChanged(int arg1)
{
Settings node = settings.write["launcher"]["extraRepositoryEnabled"];
node->Bool() = arg1;
ui->lineEditRepositoryExtra->setEnabled(arg1);
}
void CSettingsView::on_lineEditRepositoryExtra_textEdited(const QString &arg1)
{
Settings node = settings.write["launcher"]["extraRepositoryURL"];
node->String() = arg1.toStdString();
}
void CSettingsView::on_spinBoxInterfaceScaling_valueChanged(int arg1)
{
Settings node = settings.write["video"]["resolution"]["scaling"];
node->Float() = arg1;
}

View File

@ -40,12 +40,10 @@ private slots:
void on_comboBoxNeutralAI_currentTextChanged(const QString & arg1);
void on_comboBoxEnemyAI_currentTextChanged(const QString & arg1);
void on_spinBoxNetworkPort_valueChanged(int arg1);
void on_plainTextEditRepos_textChanged();
void on_openTempDir_clicked();
void on_openUserDataDir_clicked();
void on_openGameDataDir_clicked();
void on_comboBoxShowIntro_currentIndexChanged(int index);
void on_changeGameDataDir_clicked();
void on_comboBoxAutoCheck_currentIndexChanged(int index);
void on_comboBoxDisplayIndex_currentIndexChanged(int index);
void on_comboBoxAutoSave_currentIndexChanged(int index);
@ -57,6 +55,14 @@ private slots:
void on_comboBoxLanguageBase_currentIndexChanged(int index);
void on_checkBoxRepositoryDefault_stateChanged(int arg1);
void on_checkBoxRepositoryExtra_stateChanged(int arg1);
void on_lineEditRepositoryExtra_textEdited(const QString &arg1);
void on_spinBoxInterfaceScaling_valueChanged(int arg1);
private:
Ui::CSettingsView * ui;

View File

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>842</width>
<height>363</height>
<width>832</width>
<height>350</height>
</rect>
</property>
<property name="windowTitle">
@ -113,16 +113,207 @@
<rect>
<x>0</x>
<y>0</y>
<width>620</width>
<height>745</height>
<width>610</width>
<height>786</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout" columnstretch="3,0,0,0">
<item row="19" column="1" colspan="3">
<widget class="QComboBox" name="comboBoxEnemyAI">
<property name="editable">
<bool>false</bool>
<layout class="QGridLayout" name="gridLayout" columnstretch="3,0,1,1,1">
<item row="22" column="0">
<widget class="QLabel" name="labelDataDirs">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Data Directories</string>
</property>
</widget>
</item>
<item row="5" column="4">
<widget class="QPushButton" name="pushButtonTranslation">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="labelLanguageBase">
<property name="text">
<string>Heroes III Data Language</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="labelLanguage">
<property name="text">
<string>VCMI Language</string>
</property>
</widget>
</item>
<item row="25" column="0">
<widget class="QLabel" name="labelTempDir">
<property name="text">
<string>Log files directory</string>
</property>
</widget>
</item>
<item row="16" column="0">
<widget class="QLabel" name="labelArtificialIntelligence">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Artificial Intelligence</string>
</property>
</widget>
</item>
<item row="24" column="0">
<widget class="QLabel" name="labelUserDataDir">
<property name="text">
<string>User data directory</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="labelTranslation">
<property name="text">
<string>Heroes III Translation</string>
</property>
</widget>
</item>
<item row="8" column="0">
<widget class="QLabel" name="labelBuildVersionDesc">
<property name="text">
<string>Build version</string>
</property>
</widget>
</item>
<item row="12" column="0">
<widget class="QLabel" name="labelInterfaceScaling">
<property name="text">
<string>Interface Scaling</string>
</property>
</widget>
</item>
<item row="7" column="1" colspan="4">
<widget class="QComboBox" name="comboBoxAutoSave">
<property name="currentIndex">
<number>1</number>
</property>
<item>
<property name="text">
<string>Off</string>
</property>
</item>
<item>
<property name="text">
<string>On</string>
</property>
</item>
</widget>
</item>
<item row="11" column="0">
<widget class="QLabel" name="labelFullScreen">
<property name="text">
<string>Fullscreen</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>
</property>
<property name="text">
<string>General</string>
</property>
</widget>
</item>
<item row="19" column="0">
<widget class="QLabel" name="labelNeutralAI">
<property name="text">
<string>Neutral AI</string>
</property>
</widget>
</item>
<item row="6" column="1" colspan="4">
<widget class="QSpinBox" name="spinBoxNetworkPort">
<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="21" column="0">
<widget class="QLabel" name="labelEnemyAI">
<property name="text">
<string>Enemy AI</string>
</property>
</widget>
</item>
<item row="7" column="0">
<widget class="QLabel" name="labelAutoSave">
<property name="text">
<string>Autosave</string>
</property>
</widget>
</item>
<item row="10" column="0">
<widget class="QLabel" name="labelResolution">
<property name="text">
<string>Resolution</string>
</property>
</widget>
</item>
<item row="5" column="1" colspan="3">
<widget class="QLabel" name="labelTranslationStatus">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="17" column="1" colspan="4">
<widget class="QComboBox" name="comboBoxEnemyPlayerAI">
<property name="currentText">
<string notr="true">VCAI</string>
</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="8" column="1" colspan="4">
<widget class="QLineEdit" name="lineEditBuildVersion">
<property name="text">
<string notr="true"/>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="19" column="1" colspan="4">
<widget class="QComboBox" name="comboBoxNeutralAI">
<property name="currentText">
<string notr="true">BattleAI</string>
</property>
@ -138,13 +329,6 @@
</item>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="labelLanguage">
<property name="text">
<string>VCMI Language</string>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QLabel" name="labelNetworkPort">
<property name="text">
@ -152,31 +336,101 @@
</property>
</widget>
</item>
<item row="11" column="0">
<widget class="QLabel" name="labelFullScreen">
<item row="25" column="1" colspan="3">
<widget class="QLineEdit" name="lineEditTempDir">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Fullscreen</string>
<string notr="true">/home/user/.vcmi</string>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="10" column="0">
<widget class="QLabel" name="labelResolution">
<item row="14" column="1" colspan="4">
<widget class="QComboBox" name="comboBoxDisplayIndex"/>
</item>
<item row="29" column="0">
<widget class="QLabel" name="labelRepositoryExtra">
<property name="text">
<string>Resolution</string>
<string>Additional repository</string>
</property>
</widget>
</item>
<item row="17" column="0">
<widget class="QLabel" name="labelNeutralAI">
<item row="23" column="0">
<widget class="QLabel" name="labelGameDir">
<property name="text">
<string>Neutral AI</string>
<string>Game data directory</string>
</property>
</widget>
</item>
<item row="7" column="0">
<widget class="QLabel" name="labelAutoSave">
<item row="13" column="0">
<widget class="QLabel" name="labelShowIntro">
<property name="text">
<string>Autosave</string>
<string>Show intro</string>
</property>
</widget>
</item>
<item row="15" column="0">
<widget class="QLabel" name="labelCursorType">
<property name="text">
<string>Cursor</string>
</property>
</widget>
</item>
<item row="24" column="4">
<widget class="QPushButton" name="openUserDataDir">
<property name="text">
<string>Open</string>
</property>
</widget>
</item>
<item row="27" column="0">
<widget class="QLabel" name="labelAutoCheck">
<property name="text">
<string>Check on startup</string>
</property>
</widget>
</item>
<item row="1" column="1" colspan="4">
<widget class="QComboBox" name="comboBoxLanguage"/>
</item>
<item row="24" column="1" colspan="3">
<widget class="QLineEdit" name="lineEditUserDataDir">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string notr="true">/home/user/.vcmi</string>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="18" column="1" colspan="4">
<widget class="QComboBox" name="comboBoxAlliedPlayerAI">
<property name="currentText">
<string notr="true">VCAI</string>
</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="25" column="4">
<widget class="QPushButton" name="openTempDir">
<property name="text">
<string>Open</string>
</property>
</widget>
</item>
@ -193,40 +447,7 @@
</property>
</widget>
</item>
<item row="23" column="1" colspan="2">
<widget class="QLineEdit" name="lineEditTempDir">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string notr="true">/home/user/.vcmi</string>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="13" column="1" colspan="3">
<widget class="QComboBox" name="comboBoxDisplayIndex"/>
</item>
<item row="14" column="0">
<widget class="QLabel" name="labelCursorType">
<property name="text">
<string>Cursor</string>
</property>
</widget>
</item>
<item row="22" column="3">
<widget class="QPushButton" name="openUserDataDir">
<property name="text">
<string>Open</string>
</property>
</widget>
</item>
<item row="1" column="1" colspan="3">
<widget class="QComboBox" name="comboBoxLanguage"/>
</item>
<item row="18" column="1" colspan="3">
<item row="20" column="1" colspan="4">
<widget class="QComboBox" name="comboBoxFriendlyAI">
<property name="editable">
<bool>false</bool>
@ -246,7 +467,58 @@
</item>
</widget>
</item>
<item row="11" column="1" colspan="3">
<item row="18" column="0">
<widget class="QLabel" name="labelAlliedPlayerAI">
<property name="text">
<string>Adventure Map Allies</string>
</property>
</widget>
</item>
<item row="13" column="1" colspan="4">
<widget class="QComboBox" name="comboBoxShowIntro">
<property name="currentIndex">
<number>1</number>
</property>
<item>
<property name="text">
<string>Off</string>
</property>
</item>
<item>
<property name="text">
<string>On</string>
</property>
</item>
</widget>
</item>
<item row="21" 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="17" column="0">
<widget class="QLabel" name="labelEnemyPlayerAI">
<property name="text">
<string>Adventure Map Enemies</string>
</property>
</widget>
</item>
<item row="11" column="1" colspan="4">
<widget class="QComboBox" name="comboBoxFullScreen">
<property name="currentIndex">
<number>0</number>
@ -268,142 +540,48 @@
</item>
</widget>
</item>
<item row="6" column="1" colspan="3">
<widget class="QSpinBox" name="spinBoxNetworkPort">
<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="23" column="3">
<widget class="QPushButton" name="openTempDir">
<item row="23" column="4">
<widget class="QPushButton" name="openGameDataDir">
<property name="text">
<string>Open</string>
</property>
</widget>
</item>
<item row="7" column="1" colspan="3">
<widget class="QComboBox" name="comboBoxAutoSave">
<property name="currentIndex">
<number>1</number>
</property>
<item>
<property name="text">
<string>Off</string>
</property>
</item>
<item>
<property name="text">
<string>On</string>
</property>
</item>
</widget>
</item>
<item row="20" column="0">
<widget class="QLabel" name="labelDataDirs">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<widget class="QLabel" name="labelFriendlyAI">
<property name="text">
<string>Data Directories</string>
<string>Friendly AI</string>
</property>
</widget>
</item>
<item row="21" column="2">
<widget class="QPushButton" name="changeGameDataDir">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Change</string>
</property>
</widget>
</item>
<item row="22" column="0">
<widget class="QLabel" name="labelUserDataDir">
<property name="text">
<string>User data directory</string>
</property>
</widget>
</item>
<item row="8" column="0">
<widget class="QLabel" name="labelBuildVersionDesc">
<property name="text">
<string>Build version</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>
</property>
<property name="text">
<string>General</string>
</property>
</widget>
</item>
<item row="12" column="0">
<widget class="QLabel" name="labelShowIntro">
<property name="text">
<string>Show intro</string>
</property>
</widget>
</item>
<item row="25" column="2" colspan="2">
<widget class="QPushButton" name="updatesButton">
<property name="text">
<string>Update now</string>
</property>
</widget>
</item>
<item row="13" column="0">
<widget class="QLabel" name="labelDisplayIndex">
<property name="text">
<string>Display index</string>
</property>
</widget>
</item>
<item row="21" column="1">
<widget class="QLineEdit" name="lineEditGameDir">
<property name="text">
<string notr="true">/usr/share/vcmi</string>
</property>
</widget>
</item>
<item row="17" column="1" colspan="3">
<widget class="QComboBox" name="comboBoxNeutralAI">
<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="10" column="1" colspan="3">
<item row="10" column="1" colspan="4">
<widget class="QComboBox" name="comboBoxResolution"/>
</item>
<item row="24" column="0">
<item row="15" 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>
</widget>
</item>
<item row="28" column="0">
<widget class="QLabel" name="labelRepositoryDefault">
<property name="text">
<string>Default repository</string>
</property>
</widget>
</item>
<item row="4" column="1" colspan="4">
<widget class="QComboBox" name="comboBoxLanguageBase"/>
</item>
<item row="26" column="0">
<widget class="QLabel" name="labelRepositories">
<property name="font">
<font>
@ -416,68 +594,34 @@
</property>
</widget>
</item>
<item row="18" column="0">
<widget class="QLabel" name="labelFriendlyAI">
<item row="14" column="0">
<widget class="QLabel" name="labelDisplayIndex">
<property name="text">
<string>Friendly AI</string>
<string>Display index</string>
</property>
</widget>
</item>
<item row="25" column="0">
<widget class="QLabel" name="labelAutoCheck">
<property name="text">
<string>Check on startup</string>
</property>
</widget>
</item>
<item row="12" column="1" colspan="3">
<widget class="QComboBox" name="comboBoxShowIntro">
<property name="currentIndex">
<number>1</number>
</property>
<item>
<property name="text">
<string>Off</string>
</property>
</item>
<item>
<property name="text">
<string>On</string>
</property>
</item>
</widget>
</item>
<item row="22" column="1" colspan="2">
<widget class="QLineEdit" name="lineEditUserDataDir">
<item row="28" column="1">
<widget class="QCheckBox" name="checkBoxRepositoryDefault">
<property name="enabled">
<bool>false</bool>
<bool>true</bool>
</property>
<property name="text">
<string notr="true">/home/user/.vcmi</string>
<string/>
</property>
<property name="readOnly">
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="21" column="0">
<widget class="QLabel" name="labelGameDir">
<item row="29" column="2" colspan="3">
<widget class="QLineEdit" name="lineEditRepositoryExtra">
<property name="text">
<string>Extra data directory</string>
<string notr="true"/>
</property>
</widget>
</item>
<item row="21" column="3">
<widget class="QPushButton" name="openGameDataDir">
<property name="text">
<string>Open</string>
</property>
</widget>
</item>
<item row="4" column="1" colspan="3">
<widget class="QComboBox" name="comboBoxLanguageBase"/>
</item>
<item row="25" column="1">
<item row="27" column="1" colspan="2">
<widget class="QComboBox" name="comboBoxAutoCheck">
<property name="currentIndex">
<number>1</number>
@ -494,32 +638,15 @@
</item>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="labelLanguageBase">
<item row="27" column="3" colspan="2">
<widget class="QPushButton" name="updatesButton">
<property name="text">
<string>Heroes III Data Language</string>
<string>Update now</string>
</property>
</widget>
</item>
<item row="16" column="1" colspan="3">
<widget class="QComboBox" name="comboBoxPlayerAI">
<property name="currentText">
<string notr="true">VCAI</string>
</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="8" column="1" colspan="3">
<widget class="QLineEdit" name="lineEditBuildVersion">
<item row="28" column="2" colspan="3">
<widget class="QLineEdit" name="lineEditRepositoryDefault">
<property name="text">
<string notr="true"/>
</property>
@ -528,82 +655,36 @@
</property>
</widget>
</item>
<item row="19" column="0">
<widget class="QLabel" name="labelEnemyAI">
<property name="text">
<string>Enemy AI</string>
</property>
</widget>
</item>
<item row="26" column="0" colspan="4">
<widget class="QPlainTextEdit" name="plainTextEditRepos">
<property name="lineWrapMode">
<enum>QPlainTextEdit::NoWrap</enum>
</property>
<property name="plainText">
<string notr="true">http://downloads.vcmi.eu/Mods/repository.json</string>
</property>
</widget>
</item>
<item row="14" column="1" colspan="3">
<widget class="QComboBox" name="comboBoxCursorType">
<item>
<property name="text">
<string>Hardware</string>
</property>
</item>
<item>
<property name="text">
<string>Software</string>
</property>
</item>
</widget>
</item>
<item row="15" column="0">
<widget class="QLabel" name="labelArtificialIntelligence">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Artificial Intelligence</string>
</property>
</widget>
</item>
<item row="23" column="0">
<widget class="QLabel" name="labelTempDir">
<property name="text">
<string>Log files directory</string>
</property>
</widget>
</item>
<item row="16" column="0">
<widget class="QLabel" name="labelPlayerAI">
<property name="text">
<string>Adventure Map AI</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="labelTranslation">
<property name="text">
<string>Heroes III Translation</string>
</property>
</widget>
</item>
<item row="5" column="3">
<widget class="QPushButton" name="pushButtonTranslation">
<item row="29" column="1">
<widget class="QCheckBox" name="checkBoxRepositoryExtra">
<property name="text">
<string/>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="5" column="1" colspan="2">
<widget class="QLabel" name="labelTranslationStatus">
<item row="23" column="1" colspan="3">
<widget class="QLineEdit" name="lineEditGameDir">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string/>
<string notr="true">/usr/share/vcmi</string>
</property>
</widget>
</item>
<item row="12" column="1" colspan="4">
<widget class="QSpinBox" name="spinBoxInterfaceScaling">
<property name="minimum">
<number>50</number>
</property>
<property name="maximum">
<number>400</number>
</property>
<property name="singleStep">
<number>10</number>
</property>
</widget>
</item>