diff --git a/Translator/textdata/langs_list_model.cpp b/Translator/textdata/langs_list_model.cpp index 07ba2ade8..aa292d6f9 100644 --- a/Translator/textdata/langs_list_model.cpp +++ b/Translator/textdata/langs_list_model.cpp @@ -20,15 +20,34 @@ #include #include #include +#include #include #include "langs_list_model.h" -LangsListModel::LangsListModel(TranslateProject *project, QObject *parent) +void LangsListModel::rebuildMap() +{ + m_viewByLang.clear(); + + for(int i = 0; i < m_view.size(); ++i) + m_viewByLang[m_view[i].code] = i; +} + +LangsListModel::LangsListModel(TranslateProject *project, QSettings *setup, QObject *parent) : QAbstractTableModel(parent) , m_project(project) + , m_setup(setup) { Q_ASSERT(m_project); + Q_ASSERT(m_setup); +} + +bool LangsListModel::langIsVisible(const QString &langCode) +{ + if(m_viewByLang.contains(langCode)) + return m_view[m_viewByLang[langCode]].vis; + + return false; } static QString getStdLangName(const QString &fname) @@ -44,6 +63,9 @@ void LangsListModel::refreshData() beginResetModel(); m_view.clear(); + m_viewByLang.clear(); + + m_setup->beginGroup("LangVisibility"); for(auto it = m_project->begin(); it != m_project->end(); ++it) { @@ -53,7 +75,7 @@ void LangsListModel::refreshData() auto &et = it.value(); LangsView e; - e.vis = false; // TODO: Preserve favourite languages and show them always with no matter which project is + e.vis = m_setup->value(it.key(), false).toBool(); e.strings = et.t_strings; e.translated = et.t_translated; e.code = it.key(); @@ -66,9 +88,12 @@ void LangsListModel::refreshData() if(!e.lang_name.isEmpty()) e.lang_name[0] = e.lang_name[0].toUpper(); + m_viewByLang[e.code] = (int)m_view.size(); m_view.push_back(e); } + m_setup->endGroup(); + endResetModel(); } @@ -76,6 +101,7 @@ void LangsListModel::clear() { beginResetModel(); m_view.clear(); + m_viewByLang.clear(); endResetModel(); } @@ -210,6 +236,8 @@ void LangsListModel::sort(int column, Qt::SortOrder order) emit dataChanged(QModelIndex(), QModelIndex()); break; } + + rebuildMap(); } int LangsListModel::rowCount(const QModelIndex &parent) const @@ -290,6 +318,11 @@ bool LangsListModel::setData(const QModelIndex &index, const QVariant &value, in case C_VISIBLE: it.vis = (value.toInt() == Qt::Checked); emit dataChanged(index, index, {role}); + emit visibilityChanged(); + m_setup->beginGroup("LangVisibility"); + m_setup->setValue(it.code, it.vis); + m_setup->endArray(); + m_setup->sync(); break; default: diff --git a/Translator/textdata/langs_list_model.h b/Translator/textdata/langs_list_model.h index c48048502..6d4c2d605 100644 --- a/Translator/textdata/langs_list_model.h +++ b/Translator/textdata/langs_list_model.h @@ -21,13 +21,17 @@ #define LANGSLISTMODEL_H #include +#include #include "textdata.h" +class QSettings; + class LangsListModel : public QAbstractTableModel { Q_OBJECT TranslateProject *m_project = nullptr; + QSettings *m_setup = nullptr; struct LangsView { @@ -40,9 +44,15 @@ class LangsListModel : public QAbstractTableModel typedef QVector LangsViewList; LangsViewList m_view; + QHash m_viewByLang; + + void rebuildMap(); + +signals: + void visibilityChanged(); public: - explicit LangsListModel(TranslateProject *project, QObject *parent = nullptr); + explicit LangsListModel(TranslateProject *project, QSettings *setup, QObject *parent = nullptr); enum Columns { @@ -55,6 +65,8 @@ class LangsListModel : public QAbstractTableModel P_COLUMNS_COUNT }; + bool langIsVisible(const QString &langCode); + void refreshData(); void clear(); diff --git a/Translator/translator_main.cpp b/Translator/translator_main.cpp index ea76e3d28..d0ef944fa 100644 --- a/Translator/translator_main.cpp +++ b/Translator/translator_main.cpp @@ -66,7 +66,7 @@ TranslatorMain::TranslatorMain(QWidget *parent) : ui->dialoguesList->setModel(m_dialoguesListModel); ui->dialoguesList->setColumnWidth(0, 24); - m_langsListModel = new LangsListModel(&m_project, ui->languagesTable); + m_langsListModel = new LangsListModel(&m_project, &m_setup, ui->languagesTable); ui->languagesTable->setModel(m_langsListModel); ui->languagesTable->setColumnWidth(0, 24); ui->languagesTable->setColumnWidth(1, 35); @@ -75,6 +75,9 @@ TranslatorMain::TranslatorMain(QWidget *parent) : CheckBoxDelegate *langSelectVis = new CheckBoxDelegate(ui->languagesTable); ui->languagesTable->setItemDelegateForColumn(LangsListModel::C_VISIBLE, langSelectVis); + QObject::connect(m_langsListModel, &LangsListModel::visibilityChanged, + this, &TranslatorMain::updateTranslateFields); + m_highLighter = s_makeMsgBoxMacrosHighlighter(ui->sourceLineRO->document()); ui->sourceLineRO->installEventFilter(this); @@ -134,110 +137,12 @@ TranslatorMain::TranslatorMain(QWidget *parent) : m_dialoguesListModel->clear(); }); - QObject::connect(ui->fileStrings->selectionModel(), - &QItemSelectionModel::selectionChanged, - this, - [this](const QItemSelection &selected, const QItemSelection &)->void - { - auto ar = selected.indexes(); - if(ar.isEmpty() || !ar.first().isValid()) - { - resetTranslationFields(); - return; - } - - auto &index = ar.first(); - updateTranslationFields(index.sibling(index.row(), FilesStringsModel::C_TITLE)); - }); - - QObject::connect(ui->dialoguesList->selectionModel(), - &QItemSelectionModel::selectionChanged, - this, - [this](const QItemSelection &selected, const QItemSelection &)->void - { - auto ar = selected.indexes(); - if(ar.isEmpty() || !ar.first().isValid()) - { - m_dialogueItems.clear(); - return; - } - - auto &index = ar.first(); - - int key = index.sibling(index.row(), DialoguesListModel::C_INDEX).data(Qt::DisplayRole).toInt(); - auto &l = m_dialoguesListModel->level(); - auto lk = m_dialoguesListModel->levelKey(); - - m_dialogueItems.clear(); - - for(TranslationData_DialogueNode &d : l.dialogues[key].messages) - { - if(d.item_index == -1) - continue; // skip invalid items - - if(d.type == TranslationData_DialogueNode::T_END) - break; + QObject::connect(ui->fileStrings->selectionModel(), &QItemSelectionModel::selectionChanged, + this, + static_cast(&TranslatorMain::syncTranslationFieldsContent)); - switch(d.type) - { - case TranslationData_DialogueNode::T_NPC_TALK: - { - QSharedPointer dd(new DialogueItem(&m_project, - m_recentLang, - lk, - DialogueItem::T_NPC, - d.item_index, - ui->dialoguePreview)); - ui->dialoguePreviewLayout->insertWidget(ui->dialoguePreviewLayout->count() - 1, dd.data()); - QObject::connect(dd.data(), - &DialogueItem::clicked, - this, - [this, d, lk]()->void - { - auto &l = m_project["metadata"].levels[lk]; - auto &it = l.npc[d.item_index]; - updateTranslationFields(TextTypes::S_LEVEL, - lk, - TextTypes::LDT_NPC, - d.item_index, - it.talk.text, - it.talk.note); - }); - m_dialogueItems.push_back(std::move(dd)); - break; - } - - case TranslationData_DialogueNode::T_EVENT_MSG: - { - QSharedPointer dd(new DialogueItem(&m_project, - m_recentLang, - lk, - DialogueItem::T_EVENT, - d.item_index, - ui->dialoguePreview)); - ui->dialoguePreviewLayout->insertWidget(ui->dialoguePreviewLayout->count() - 1, dd.data()); - QObject::connect(dd.data(), - &DialogueItem::clicked, - this, - [this, d, lk]()->void - { - auto &l = m_project["metadata"].levels[lk]; - auto &it = l.events[d.item_index]; - updateTranslationFields(TextTypes::S_LEVEL, - lk, - TextTypes::LDT_EVENT, - d.item_index, - it.message.text, - it.message.note); - }); - m_dialogueItems.push_back(std::move(dd)); - break; - } - default: - break; - } - } - }); + QObject::connect(ui->dialoguesList->selectionModel(), &QItemSelectionModel::selectionChanged, + this, &TranslatorMain::syncDialoguesList); QObject::connect(ui->legacyLineBreak, static_cast(&QCheckBox::clicked), @@ -580,6 +485,111 @@ void TranslatorMain::resetTranslationFields() k->clearItem(); } +void TranslatorMain::syncTranslationFieldsContent() +{ + syncTranslationFieldsContent(ui->fileStrings->selectionModel()->selection(), + ui->fileStrings->selectionModel()->selection()); +} + +void TranslatorMain::syncTranslationFieldsContent(const QItemSelection &selected, const QItemSelection &) +{ + auto ar = selected.indexes(); + if(ar.isEmpty() || !ar.first().isValid()) + { + resetTranslationFields(); + return; + } + + auto &index = ar.first(); + updateTranslationFields(index.sibling(index.row(), FilesStringsModel::C_TITLE)); +} + +void TranslatorMain::syncDialoguesList(const QItemSelection &selected, const QItemSelection &) +{ + auto ar = selected.indexes(); + if(ar.isEmpty() || !ar.first().isValid()) + { + m_dialogueItems.clear(); + return; + } + + auto &index = ar.first(); + + int key = index.sibling(index.row(), DialoguesListModel::C_INDEX).data(Qt::DisplayRole).toInt(); + auto &l = m_dialoguesListModel->level(); + auto lk = m_dialoguesListModel->levelKey(); + + m_dialogueItems.clear(); + + for(TranslationData_DialogueNode &d : l.dialogues[key].messages) + { + if(d.item_index == -1) + continue; // skip invalid items + + if(d.type == TranslationData_DialogueNode::T_END) + break; + + switch(d.type) + { + case TranslationData_DialogueNode::T_NPC_TALK: + { + QSharedPointer dd(new DialogueItem(&m_project, + m_recentLang, + lk, + DialogueItem::T_NPC, + d.item_index, + ui->dialoguePreview)); + ui->dialoguePreviewLayout->insertWidget(ui->dialoguePreviewLayout->count() - 1, dd.data()); + QObject::connect(dd.data(), + &DialogueItem::clicked, + this, + [this, d, lk]()->void + { + auto &l = m_project["metadata"].levels[lk]; + auto &it = l.npc[d.item_index]; + updateTranslationFields(TextTypes::S_LEVEL, + lk, + TextTypes::LDT_NPC, + d.item_index, + it.talk.text, + it.talk.note); + }); + m_dialogueItems.push_back(std::move(dd)); + break; + } + + case TranslationData_DialogueNode::T_EVENT_MSG: + { + QSharedPointer dd(new DialogueItem(&m_project, + m_recentLang, + lk, + DialogueItem::T_EVENT, + d.item_index, + ui->dialoguePreview)); + ui->dialoguePreviewLayout->insertWidget(ui->dialoguePreviewLayout->count() - 1, dd.data()); + QObject::connect(dd.data(), + &DialogueItem::clicked, + this, + [this, d, lk]()->void + { + auto &l = m_project["metadata"].levels[lk]; + auto &it = l.events[d.item_index]; + updateTranslationFields(TextTypes::S_LEVEL, + lk, + TextTypes::LDT_EVENT, + d.item_index, + it.message.text, + it.message.note); + }); + m_dialogueItems.push_back(std::move(dd)); + break; + } + default: + break; + } + } +} + void TranslatorMain::updateTranslationFields(const QModelIndex &s) { QString text = s.data(Qt::DisplayRole).toString(); @@ -671,6 +681,9 @@ void TranslatorMain::updateTranslateFields() if(k.key() == "metadata") continue; // Ignore origin translation + if(!m_langsListModel->langIsVisible(k.key())) + continue; + QSharedPointer f(new TranslateField(&m_project, ui->translationGroup)); f->setLang(k.key()); QObject::connect(f.data(), &TranslateField::textChanged, @@ -694,6 +707,8 @@ void TranslatorMain::updateTranslateFields() ui->translationLayout->insertWidget(ui->translationLayout->count() - 1, f.data()); m_translateFields.insert(k.key(), std::move(f)); } + + syncTranslationFieldsContent(); } void TranslatorMain::on_actionQuit_triggered() @@ -748,14 +763,13 @@ void TranslatorMain::on_languagesAdd_clicked() TextDataProcessor t; t.createTranslation(m_project, newLang); - m_recentLang = "metadata"; - ui->previewZone->clearText(); - m_dialogueItems.clear(); - m_dialoguesListModel->clear(); - m_filesStringsModel->clear(); - m_filesListModel->rebuildView(m_recentPath); + // m_recentLang = "metadata"; + // ui->previewZone->clearText(); + // m_dialogueItems.clear(); + // m_dialoguesListModel->clear(); + // m_filesStringsModel->clear(); + // m_filesListModel->rebuildView(m_recentPath); m_langsListModel->refreshData(); updateTranslateFields(); } } - diff --git a/Translator/translator_main.h b/Translator/translator_main.h index bb5b332ae..86bf691f3 100644 --- a/Translator/translator_main.h +++ b/Translator/translator_main.h @@ -24,6 +24,7 @@ #include #include #include +#include #include "textdata/textdata.h" @@ -98,6 +99,11 @@ private slots: void openProject(const QString &d, bool singleLevel = false); void resetTranslationFields(); + void syncTranslationFieldsContent(); + void syncTranslationFieldsContent(const QItemSelection &selected, const QItemSelection &); + + void syncDialoguesList(const QItemSelection &selected, const QItemSelection &); + void updateTranslationFields(const QModelIndex &s); void updateTranslationFields(int group, const QString &root,