diff --git a/mapeditor/icons/translations.png b/mapeditor/icons/translations.png index 0b0317386..1935db72f 100644 Binary files a/mapeditor/icons/translations.png and b/mapeditor/icons/translations.png differ diff --git a/mapeditor/mapsettings/translations.cpp b/mapeditor/mapsettings/translations.cpp index 6d4f6fc43..0b77b4cfc 100644 --- a/mapeditor/mapsettings/translations.cpp +++ b/mapeditor/mapsettings/translations.cpp @@ -25,8 +25,10 @@ Translations::Translations(CMapHeader & mh, QWidget *parent) : //fill languages list for(auto & language : Languages::getLanguageList()) { + ui->languageSelect->blockSignals(true); ui->languageSelect->addItem(QString("%1 (%2)").arg(QString::fromStdString(language.nameEnglish), QString::fromStdString(language.nameNative))); ui->languageSelect->setItemData(ui->languageSelect->count() - 1, QVariant(QString::fromStdString(language.identifier))); + ui->languageSelect->blockSignals(false); if(language.identifier == VLC->generaltexth->getPreferredLanguage()) ui->languageSelect->setCurrentIndex(ui->languageSelect->count() - 1); } @@ -37,31 +39,38 @@ Translations::~Translations() delete ui; } +void Translations::fillTranslationsTable(const std::string & language) +{ + auto & translation = mapHeader.translations[language]; + ui->translationsTable->blockSignals(true); + ui->translationsTable->setRowCount(0); + ui->translationsTable->setRowCount(translation.Struct().size()); + int i = 0; + for(auto & s : translation.Struct()) + { + auto * wId = new QTableWidgetItem(QString::fromStdString(s.first)); + auto * wText = new QTableWidgetItem(QString::fromStdString(s.second.String())); + wId->setFlags(wId->flags() & ~Qt::ItemIsEditable); + wText->setFlags(wId->flags() | Qt::ItemIsEditable); + ui->translationsTable->setItem(i, 0, wId); + ui->translationsTable->setItem(i++, 1, wText); + } + ui->translationsTable->resizeColumnToContents(0); + ui->translationsTable->blockSignals(false); +} + void Translations::on_languageSelect_currentIndexChanged(int index) { auto language = ui->languageSelect->currentData().toString().toStdString(); - auto & translation = mapHeader.translations[language]; - bool hasLanguage = !translation.isNull(); + bool hasLanguage = !mapHeader.translations[language].isNull(); ui->supportedCheck->blockSignals(true); ui->supportedCheck->setChecked(hasLanguage); ui->supportedCheck->blockSignals(false); ui->translationsTable->setEnabled(hasLanguage); if(hasLanguage) - { - ui->translationsTable->blockSignals(true); - ui->translationsTable->setRowCount(translation.Struct().size()); - int i = 0; - for(auto & s : translation.Struct()) - { - auto * wId = new QTableWidgetItem(QString::fromStdString(s.first)); - auto * wText = new QTableWidgetItem(QString::fromStdString(s.second.String())); - wId->setFlags(wId->flags() & ~Qt::ItemIsEditable); - wText->setFlags(wId->flags() | Qt::ItemIsEditable); - ui->translationsTable->setItem(i, 0, wId); - ui->translationsTable->setItem(i++, 0, wText); - } - ui->translationsTable->blockSignals(false); - } + fillTranslationsTable(language); + else + ui->translationsTable->setRowCount(0); } @@ -69,32 +78,15 @@ void Translations::on_supportedCheck_toggled(bool checked) { auto language = ui->languageSelect->currentData().toString().toStdString(); auto & translation = mapHeader.translations[language]; - bool hasLanguage = !translation.isNull(); bool hasRecord = !translation.Struct().empty(); if(checked) { - if(!hasLanguage) - translation = JsonNode(JsonNode::JsonType::DATA_STRUCT); - //copy from default language translation = mapHeader.translations[VLC->generaltexth->getPreferredLanguage()]; - hasLanguage = !translation.isNull(); - ui->translationsTable->blockSignals(true); - ui->translationsTable->setRowCount(translation.Struct().size()); - int i = 0; - for(auto & s : translation.Struct()) - { - auto * wId = new QTableWidgetItem(QString::fromStdString(s.first)); - auto * wText = new QTableWidgetItem(QString::fromStdString(s.second.String())); - wId->setFlags(wId->flags() & ~Qt::ItemIsEditable); - wText->setFlags(wId->flags() | Qt::ItemIsEditable); - ui->translationsTable->setItem(i, 0, wId); - ui->translationsTable->setItem(i++, 0, wText); - } - ui->translationsTable->blockSignals(false); - ui->translationsTable->setEnabled(hasLanguage); + fillTranslationsTable(language); + ui->translationsTable->setEnabled(true); } else { @@ -117,16 +109,28 @@ void Translations::on_supportedCheck_toggled(bool checked) return; } ui->translationsTable->blockSignals(true); - ui->translationsTable->clear(); - translation = JsonNode(); + ui->translationsTable->setRowCount(0); + translation = JsonNode(JsonNode::JsonType::DATA_NULL); ui->translationsTable->blockSignals(false); ui->translationsTable->setEnabled(false); } } -void Translations::on_translationsTable_itemChanged(QTableWidgetItem *item) +void Translations::on_translationsTable_itemChanged(QTableWidgetItem * item) { - + assert(item->column() == 1); + + auto language = ui->languageSelect->currentData().toString().toStdString(); + auto & translation = mapHeader.translations[language]; + + assert(!translation.isNull()); + + auto textId = ui->translationsTable->item(item->row(), 0)->text().toStdString(); + assert(!textId.empty()); + if(textId.empty()) + return; + + translation[textId].String() = item->text().toStdString(); } diff --git a/mapeditor/mapsettings/translations.h b/mapeditor/mapsettings/translations.h index 1444e6f25..27b9c8218 100644 --- a/mapeditor/mapsettings/translations.h +++ b/mapeditor/mapsettings/translations.h @@ -20,6 +20,8 @@ class Translations; class Translations : public QDialog { Q_OBJECT + + void fillTranslationsTable(const std::string & language); public: explicit Translations(CMapHeader & mapHeader, QWidget *parent = nullptr);