From 124d32857fb82c9bc184958280458a89311bd1b5 Mon Sep 17 00:00:00 2001 From: Gres Date: Wed, 18 Mar 2020 21:21:17 +0300 Subject: [PATCH] Keep only available languages in correction selector --- src/ocr/tesseract.cpp | 30 +++++++++++++++++++-- src/ocr/tesseract.h | 2 ++ src/settingseditor.cpp | 23 +++------------- src/substitutionstable.cpp | 54 ++++++++++++++++++++++++++------------ src/substitutionstable.h | 3 +++ 5 files changed, 74 insertions(+), 38 deletions(-) diff --git a/src/ocr/tesseract.cpp b/src/ocr/tesseract.cpp index 34a9f74..fec0df8 100644 --- a/src/ocr/tesseract.cpp +++ b/src/ocr/tesseract.cpp @@ -7,8 +7,7 @@ #include #include - -#include +#include #if defined(Q_OS_LINUX) #include @@ -159,6 +158,33 @@ const QString &Tesseract::error() const return error_; } +QStringList Tesseract::availableLanguageNames(const QString &path) +{ + if (path.isEmpty()) + return {}; + + QDir dir(path); + if (!dir.exists()) + return {}; + + LanguageIds names; + LanguageCodes languages; + + const auto files = dir.entryList({"*.traineddata"}, QDir::Files); + for (const auto &file : files) { + const auto lang = file.left(file.indexOf(".")); + if (const auto bundle = languages.findByTesseract(lang)) + names.append(QObject::tr(bundle->name)); + else + names.append(lang); + } + + if (names.isEmpty()) + return {}; + + return names; +} + QString Tesseract::recognize(const QPixmap &source) { SOFT_ASSERT(engine_, return {}); diff --git a/src/ocr/tesseract.h b/src/ocr/tesseract.h index aeb8a77..367408b 100644 --- a/src/ocr/tesseract.h +++ b/src/ocr/tesseract.h @@ -23,6 +23,8 @@ public: bool isValid() const; const QString& error() const; + static QStringList availableLanguageNames(const QString& path); + private: void init(const LanguageId& language, const QString& tessdataPath); diff --git a/src/settingseditor.cpp b/src/settingseditor.cpp index c0c29b0..f3d7ec2 100644 --- a/src/settingseditor.cpp +++ b/src/settingseditor.cpp @@ -1,12 +1,12 @@ #include "settingseditor.h" #include "languagecodes.h" #include "manager.h" +#include "tesseract.h" #include "ui_settingseditor.h" #include "updates.h" #include "widgetstate.h" #include -#include #include #include @@ -161,6 +161,7 @@ void SettingsEditor::setSettings(const Settings &settings) ui->tesseractLangCombo->setCurrentText(QObject::tr(lang->name)); ui->useUserSubstitutions->setChecked(settings.useUserSubstitutions); + ui->userSubstitutionsTable->setTessdataPath(settings.tessdataPath); ui->userSubstitutionsTable->setSubstitutions(settings.userSubstitutions); ui->doTranslationCheck->setChecked(settings.doTranslation); @@ -188,24 +189,7 @@ void SettingsEditor::updateTesseractLanguages() { ui->tesseractLangCombo->clear(); - const auto path = ui->tessdataPath->text(); - if (path.isEmpty()) - return; - - QDir dir(path); - if (!dir.exists()) - return; - - LanguageIds names; - LanguageCodes languages; - - const auto files = dir.entryList({"*.traineddata"}, QDir::Files); - for (const auto &file : files) { - const auto lang = file.left(file.indexOf(".")); - if (const auto bundle = languages.findByTesseract(lang)) - names.append(QObject::tr(bundle->name)); - } - + auto names = Tesseract::availableLanguageNames(ui->tessdataPath->text()); if (names.isEmpty()) return; @@ -289,6 +273,7 @@ void SettingsEditor::handlePortableChanged() settings.setPortable(ui->portable->isChecked()); ui->tessdataPath->setText(settings.tessdataPath); ui->translatorsPath->setText(settings.translatorsDir); + ui->userSubstitutionsTable->setTessdataPath(settings.tessdataPath); updateTesseractLanguages(); updateTranslators(); diff --git a/src/substitutionstable.cpp b/src/substitutionstable.cpp index 08cf1b5..0993578 100644 --- a/src/substitutionstable.cpp +++ b/src/substitutionstable.cpp @@ -1,6 +1,7 @@ #include "substitutionstable.h" #include "debug.h" #include "languagecodes.h" +#include "tesseract.h" #include #include @@ -9,22 +10,6 @@ namespace { -QStringList allSourceLanguages() -{ - LanguageCodes langs; - const auto &allLangs = langs.all(); - - QStringList result; - result.reserve(allLangs.size()); - for (const auto &i : allLangs) { - if (i.second.tesseract.isEmpty()) - continue; - result.append(QObject::tr(i.second.name)); - } - std::sort(result.begin(), result.end()); - return result; -} - class SubstitutionDelegate : public QStyledItemDelegate { public: @@ -44,7 +29,7 @@ public: SubstitutionsTable::SubstitutionsTable(QWidget *parent) : QTableWidget(parent) - , languagesModel_(new QStringListModel(allSourceLanguages(), this)) + , languagesModel_(new QStringListModel(this)) { setItemDelegate(new SubstitutionDelegate(this)); setColumnCount(int(Column::Count)); @@ -55,11 +40,44 @@ SubstitutionsTable::SubstitutionsTable(QWidget *parent) void SubstitutionsTable::setSubstitutions(const Substitutions &substitutions) { + setRowCount(0); + + updateModel(substitutions); + for (const auto &i : substitutions) addRow(i.first, i.second); + addRow(); // for editing resizeColumnsToContents(); } +void SubstitutionsTable::setTessdataPath(const QString &tessdataPath) +{ + tessdataPath_ = tessdataPath; + if (rowCount() == 0) // must be at least 1 if inited + return; + setSubstitutions(substitutions()); +} + +void SubstitutionsTable::updateModel(const Substitutions &substitutions) +{ + auto strings = Tesseract::availableLanguageNames(tessdataPath_); + + if (!substitutions.empty()) { + LanguageCodes languages; + for (const auto &i : substitutions) { + auto name = i.first; + if (const auto bundle = languages.findByTesseract(name)) + name = QObject::tr(bundle->name); + + if (!strings.contains(name)) + strings.append(name); + } + } + + std::sort(strings.begin(), strings.end()); + languagesModel_->setStringList(strings); +} + Substitutions SubstitutionsTable::substitutions() const { Substitutions result; @@ -88,6 +106,8 @@ void SubstitutionsTable::addRow(const LanguageId &language, LanguageCodes langs; if (auto lang = langs.findById(language)) combo->setCurrentText(QObject::tr(lang->name)); + else + combo->setCurrentText(language); } else if (rowCount() > 1) { const auto previousRow = rowCount() - 2; auto previousCombo = diff --git a/src/substitutionstable.h b/src/substitutionstable.h index 165302c..f6a1a1b 100644 --- a/src/substitutionstable.h +++ b/src/substitutionstable.h @@ -15,6 +15,7 @@ public: explicit SubstitutionsTable(QWidget* parent = nullptr); void setSubstitutions(const Substitutions& substitutions); + void setTessdataPath(const QString& tessdataPath); Substitutions substitutions() const; private: @@ -22,6 +23,8 @@ private: void addRow(const LanguageId& language = {}, const Substitution& substutution = {}); std::pair at(int row) const; + void updateModel(const Substitutions& substitutions); QStringListModel* languagesModel_; + QString tessdataPath_; };