Move common model to separate class
This commit is contained in:
		
							parent
							
								
									87987f4a71
								
							
						
					
					
						commit
						258073c785
					
				@ -34,6 +34,7 @@ HEADERS += \
 | 
			
		||||
  src/capture/captureareaeditor.h \
 | 
			
		||||
  src/capture/captureareaselector.h \
 | 
			
		||||
  src/capture/capturer.h \
 | 
			
		||||
  src/commonmodels.h \
 | 
			
		||||
  src/correct/corrector.h \
 | 
			
		||||
  src/languagecodes.h \
 | 
			
		||||
  src/manager.h \
 | 
			
		||||
@ -65,6 +66,7 @@ SOURCES += \
 | 
			
		||||
  src/capture/captureareaeditor.cpp \
 | 
			
		||||
  src/capture/captureareaselector.cpp \
 | 
			
		||||
  src/capture/capturer.cpp \
 | 
			
		||||
  src/commonmodels.cpp \
 | 
			
		||||
  src/correct/corrector.cpp \
 | 
			
		||||
  src/languagecodes.cpp \
 | 
			
		||||
  src/main.cpp \
 | 
			
		||||
 | 
			
		||||
@ -1,27 +1,22 @@
 | 
			
		||||
#include "captureareaeditor.h"
 | 
			
		||||
#include "capturearea.h"
 | 
			
		||||
#include "captureareaselector.h"
 | 
			
		||||
#include "debug.h"
 | 
			
		||||
#include "commonmodels.h"
 | 
			
		||||
#include "languagecodes.h"
 | 
			
		||||
#include "settings.h"
 | 
			
		||||
#include "tesseract.h"
 | 
			
		||||
#include "translator.h"
 | 
			
		||||
 | 
			
		||||
#include <QCheckBox>
 | 
			
		||||
#include <QComboBox>
 | 
			
		||||
#include <QGridLayout>
 | 
			
		||||
#include <QLabel>
 | 
			
		||||
#include <QPushButton>
 | 
			
		||||
#include <QStringListModel>
 | 
			
		||||
 | 
			
		||||
CaptureAreaEditor::CaptureAreaEditor(CaptureAreaSelector &selector)
 | 
			
		||||
CaptureAreaEditor::CaptureAreaEditor(const CommonModels &models,
 | 
			
		||||
                                     CaptureAreaSelector &selector)
 | 
			
		||||
  : QWidget(&selector)
 | 
			
		||||
  , selector_(selector)
 | 
			
		||||
  , doTranslation_(new QCheckBox(tr("Translate:"), this))
 | 
			
		||||
  , sourceLanguage_(new QComboBox(this))
 | 
			
		||||
  , targetLanguage_(new QComboBox(this))
 | 
			
		||||
  , sourceLanguageModel_(std::make_unique<QStringListModel>())
 | 
			
		||||
  , targetLanguageModel_(std::make_unique<QStringListModel>())
 | 
			
		||||
{
 | 
			
		||||
  setCursor(Qt::CursorShape::ArrowCursor);
 | 
			
		||||
 | 
			
		||||
@ -36,8 +31,8 @@ CaptureAreaEditor::CaptureAreaEditor(CaptureAreaSelector &selector)
 | 
			
		||||
  layout->addWidget(doTranslation_, row, 0);
 | 
			
		||||
  layout->addWidget(targetLanguage_, row, 1);
 | 
			
		||||
 | 
			
		||||
  sourceLanguage_->setModel(sourceLanguageModel_.get());
 | 
			
		||||
  targetLanguage_->setModel(targetLanguageModel_.get());
 | 
			
		||||
  sourceLanguage_->setModel(models.sourceLanguageModel());
 | 
			
		||||
  targetLanguage_->setModel(models.targetLanguageModel());
 | 
			
		||||
  targetLanguage_->setEnabled(doTranslation_->isChecked());
 | 
			
		||||
 | 
			
		||||
  swapLanguages->setFlat(true);
 | 
			
		||||
@ -56,13 +51,6 @@ CaptureAreaEditor::CaptureAreaEditor(CaptureAreaSelector &selector)
 | 
			
		||||
 | 
			
		||||
CaptureAreaEditor::~CaptureAreaEditor() = default;
 | 
			
		||||
 | 
			
		||||
void CaptureAreaEditor::updateSettings(const Settings &settings)
 | 
			
		||||
{
 | 
			
		||||
  sourceLanguageModel_->setStringList(
 | 
			
		||||
      Tesseract::availableLanguageNames(settings.tessdataPath));
 | 
			
		||||
  targetLanguageModel_->setStringList(Translator::availableLanguageNames());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CaptureAreaEditor::swapLanguages()
 | 
			
		||||
{
 | 
			
		||||
  const auto target = targetLanguage_->currentText();
 | 
			
		||||
 | 
			
		||||
@ -6,18 +6,17 @@
 | 
			
		||||
 | 
			
		||||
class QCheckBox;
 | 
			
		||||
class QComboBox;
 | 
			
		||||
class QStringListModel;
 | 
			
		||||
 | 
			
		||||
class CaptureAreaEditor : public QWidget
 | 
			
		||||
{
 | 
			
		||||
  Q_OBJECT
 | 
			
		||||
public:
 | 
			
		||||
  explicit CaptureAreaEditor(CaptureAreaSelector& selector);
 | 
			
		||||
  explicit CaptureAreaEditor(const CommonModels& models,
 | 
			
		||||
                             CaptureAreaSelector& selector);
 | 
			
		||||
  ~CaptureAreaEditor();
 | 
			
		||||
 | 
			
		||||
  void set(const CaptureArea& area);
 | 
			
		||||
  void apply(CaptureArea& area) const;
 | 
			
		||||
  void updateSettings(const Settings& settings);
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  void swapLanguages();
 | 
			
		||||
@ -26,6 +25,4 @@ private:
 | 
			
		||||
  QCheckBox* doTranslation_;
 | 
			
		||||
  QComboBox* sourceLanguage_;
 | 
			
		||||
  QComboBox* targetLanguage_;
 | 
			
		||||
  std::unique_ptr<QStringListModel> sourceLanguageModel_;
 | 
			
		||||
  std::unique_ptr<QStringListModel> targetLanguageModel_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@ -12,11 +12,12 @@
 | 
			
		||||
 | 
			
		||||
CaptureAreaSelector::CaptureAreaSelector(Capturer &capturer,
 | 
			
		||||
                                         const Settings &settings,
 | 
			
		||||
                                         const CommonModels &models,
 | 
			
		||||
                                         const QPixmap &pixmap)
 | 
			
		||||
  : capturer_(capturer)
 | 
			
		||||
  , settings_(settings)
 | 
			
		||||
  , pixmap_(pixmap)
 | 
			
		||||
  , editor_(std::make_unique<CaptureAreaEditor>(*this))
 | 
			
		||||
  , editor_(std::make_unique<CaptureAreaEditor>(models, *this))
 | 
			
		||||
{
 | 
			
		||||
  setWindowFlags(Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint |
 | 
			
		||||
                 Qt::WindowStaysOnTopHint | Qt::X11BypassWindowManagerHint);
 | 
			
		||||
@ -63,9 +64,6 @@ Left click on selection - process)")
 | 
			
		||||
              .arg(sourceName, targetName, translationState);
 | 
			
		||||
 | 
			
		||||
  area_.reset();
 | 
			
		||||
 | 
			
		||||
  SOFT_ASSERT(editor_, return );
 | 
			
		||||
  editor_->updateSettings(settings_);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CaptureAreaSelector::paintEvent(QPaintEvent * /*event*/)
 | 
			
		||||
 | 
			
		||||
@ -10,7 +10,7 @@ class CaptureAreaSelector : public QWidget
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
  CaptureAreaSelector(Capturer &capturer, const Settings &settings,
 | 
			
		||||
                      const QPixmap &pixmap);
 | 
			
		||||
                      const CommonModels &models, const QPixmap &pixmap);
 | 
			
		||||
  ~CaptureAreaSelector();
 | 
			
		||||
 | 
			
		||||
  void activate();
 | 
			
		||||
 | 
			
		||||
@ -10,10 +10,12 @@
 | 
			
		||||
#include <QPainter>
 | 
			
		||||
#include <QScreen>
 | 
			
		||||
 | 
			
		||||
Capturer::Capturer(Manager &manager, const Settings &settings)
 | 
			
		||||
Capturer::Capturer(Manager &manager, const Settings &settings,
 | 
			
		||||
                   const CommonModels &models)
 | 
			
		||||
  : manager_(manager)
 | 
			
		||||
  , settings_(settings)
 | 
			
		||||
  , selector_(std::make_unique<CaptureAreaSelector>(*this, settings_, pixmap_))
 | 
			
		||||
  , selector_(std::make_unique<CaptureAreaSelector>(*this, settings_, models,
 | 
			
		||||
                                                    pixmap_))
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -7,7 +7,8 @@
 | 
			
		||||
class Capturer
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
  Capturer(Manager &manager, const Settings &settings);
 | 
			
		||||
  Capturer(Manager &manager, const Settings &settings,
 | 
			
		||||
           const CommonModels &models);
 | 
			
		||||
  ~Capturer();
 | 
			
		||||
 | 
			
		||||
  void capture();
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										40
									
								
								src/commonmodels.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								src/commonmodels.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,40 @@
 | 
			
		||||
#include "commonmodels.h"
 | 
			
		||||
#include "settings.h"
 | 
			
		||||
#include "tesseract.h"
 | 
			
		||||
#include "translator.h"
 | 
			
		||||
 | 
			
		||||
CommonModels::CommonModels()
 | 
			
		||||
  : sourceLanguageModel_(std::make_unique<QStringListModel>())
 | 
			
		||||
  , targetLanguageModel_(std::make_unique<QStringListModel>())
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CommonModels::~CommonModels() = default;
 | 
			
		||||
 | 
			
		||||
void CommonModels::update(const QString &tessdataPath)
 | 
			
		||||
{
 | 
			
		||||
  {
 | 
			
		||||
    auto names = Tesseract::availableLanguageNames(tessdataPath);
 | 
			
		||||
    std::sort(names.begin(), names.end());
 | 
			
		||||
    sourceLanguageModel_->setStringList(names);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (targetLanguageModel_->rowCount() > 0)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    auto names = Translator::availableLanguageNames();
 | 
			
		||||
    std::sort(names.begin(), names.end());
 | 
			
		||||
    targetLanguageModel_->setStringList(names);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QStringListModel *CommonModels::sourceLanguageModel() const
 | 
			
		||||
{
 | 
			
		||||
  return sourceLanguageModel_.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QStringListModel *CommonModels::targetLanguageModel() const
 | 
			
		||||
{
 | 
			
		||||
  return targetLanguageModel_.get();
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										23
									
								
								src/commonmodels.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								src/commonmodels.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,23 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include "stfwd.h"
 | 
			
		||||
 | 
			
		||||
#include <QStringListModel>
 | 
			
		||||
 | 
			
		||||
#include <memory>
 | 
			
		||||
 | 
			
		||||
class CommonModels
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
  CommonModels();
 | 
			
		||||
  ~CommonModels();
 | 
			
		||||
 | 
			
		||||
  void update(const QString& tessdataPath);
 | 
			
		||||
 | 
			
		||||
  QStringListModel* sourceLanguageModel() const;
 | 
			
		||||
  QStringListModel* targetLanguageModel() const;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  std::unique_ptr<QStringListModel> sourceLanguageModel_;
 | 
			
		||||
  std::unique_ptr<QStringListModel> targetLanguageModel_;
 | 
			
		||||
};
 | 
			
		||||
@ -1,5 +1,6 @@
 | 
			
		||||
#include "manager.h"
 | 
			
		||||
#include "capturer.h"
 | 
			
		||||
#include "commonmodels.h"
 | 
			
		||||
#include "corrector.h"
 | 
			
		||||
#include "debug.h"
 | 
			
		||||
#include "recognizer.h"
 | 
			
		||||
@ -28,11 +29,12 @@ const auto updatesUrl =
 | 
			
		||||
Manager::Manager()
 | 
			
		||||
  : settings_(std::make_unique<Settings>())
 | 
			
		||||
  , updater_(std::make_unique<update::Loader>(QUrl(updatesUrl)))
 | 
			
		||||
  , models_(std::make_unique<CommonModels>())
 | 
			
		||||
{
 | 
			
		||||
  SOFT_ASSERT(settings_, return );
 | 
			
		||||
 | 
			
		||||
  tray_ = std::make_unique<TrayIcon>(*this, *settings_);
 | 
			
		||||
  capturer_ = std::make_unique<Capturer>(*this, *settings_);
 | 
			
		||||
  capturer_ = std::make_unique<Capturer>(*this, *settings_, *models_);
 | 
			
		||||
  recognizer_ = std::make_unique<Recognizer>(*this, *settings_);
 | 
			
		||||
  translator_ = std::make_unique<Translator>(*this, *settings_);
 | 
			
		||||
  corrector_ = std::make_unique<Corrector>(*this, *settings_);
 | 
			
		||||
@ -74,6 +76,8 @@ void Manager::updateSettings()
 | 
			
		||||
  setupProxy(*settings_);
 | 
			
		||||
  setupUpdates(*settings_);
 | 
			
		||||
 | 
			
		||||
  models_->update(settings_->tessdataPath);
 | 
			
		||||
 | 
			
		||||
  tray_->updateSettings();
 | 
			
		||||
  capturer_->updateSettings();
 | 
			
		||||
  recognizer_->updateSettings();
 | 
			
		||||
 | 
			
		||||
@ -41,5 +41,6 @@ private:
 | 
			
		||||
  std::unique_ptr<Representer> representer_;
 | 
			
		||||
  std::unique_ptr<update::Loader> updater_;
 | 
			
		||||
  std::unique_ptr<update::AutoChecker> updateAutoChecker_;
 | 
			
		||||
  std::unique_ptr<CommonModels> models_;
 | 
			
		||||
  int activeTaskCount_{0};
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@ -54,13 +54,18 @@ SettingsEditor::SettingsEditor(Manager &manager, update::Loader &updater)
 | 
			
		||||
    ui->proxyPassEdit->setEchoMode(QLineEdit::PasswordEchoOnEdit);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // translation
 | 
			
		||||
  ui->tesseractLangCombo->setModel(models_.sourceLanguageModel());
 | 
			
		||||
 | 
			
		||||
  // correction
 | 
			
		||||
  ui->userSubstitutionsTable->setEnabled(ui->useUserSubstitutions->isChecked());
 | 
			
		||||
  ui->userSubstitutionsTable->setSourceLanguageModel(
 | 
			
		||||
      models_.sourceLanguageModel());
 | 
			
		||||
  connect(ui->useUserSubstitutions, &QCheckBox::toggled,  //
 | 
			
		||||
          ui->userSubstitutionsTable, &QTableWidget::setEnabled);
 | 
			
		||||
 | 
			
		||||
  // translation
 | 
			
		||||
  updateTranslationLanguages();
 | 
			
		||||
  ui->translateLangCombo->setModel(models_.targetLanguageModel());
 | 
			
		||||
 | 
			
		||||
  // representation
 | 
			
		||||
  connect(ui->dialogRadio, &QRadioButton::toggled,  //
 | 
			
		||||
@ -154,6 +159,9 @@ Settings SettingsEditor::settings() const
 | 
			
		||||
 | 
			
		||||
void SettingsEditor::setSettings(const Settings &settings)
 | 
			
		||||
{
 | 
			
		||||
  if (settings.isPortable() == ui->portable->isChecked())
 | 
			
		||||
    updateModels(settings.tessdataPath);
 | 
			
		||||
 | 
			
		||||
  wasPortable_ = settings.isPortable();
 | 
			
		||||
  ui->portable->setChecked(settings.isPortable());
 | 
			
		||||
 | 
			
		||||
@ -174,12 +182,10 @@ void SettingsEditor::setSettings(const Settings &settings)
 | 
			
		||||
  ui->proxySaveCheck->setChecked(settings.proxySavePassword);
 | 
			
		||||
 | 
			
		||||
  ui->tessdataPath->setText(settings.tessdataPath);
 | 
			
		||||
  updateTesseractLanguages();
 | 
			
		||||
  ui->tesseractLangCombo->setCurrentText(
 | 
			
		||||
      LanguageCodes::name(settings.sourceLanguage));
 | 
			
		||||
 | 
			
		||||
  ui->useUserSubstitutions->setChecked(settings.useUserSubstitutions);
 | 
			
		||||
  ui->userSubstitutionsTable->setTessdataPath(settings.tessdataPath);
 | 
			
		||||
  ui->userSubstitutionsTable->setSubstitutions(settings.userSubstitutions);
 | 
			
		||||
 | 
			
		||||
  ui->doTranslationCheck->setChecked(settings.doTranslation);
 | 
			
		||||
@ -207,18 +213,6 @@ void SettingsEditor::updateCurrentPage()
 | 
			
		||||
  ui->pagesView->setCurrentIndex(ui->pagesList->currentIndex().row());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SettingsEditor::updateTesseractLanguages()
 | 
			
		||||
{
 | 
			
		||||
  ui->tesseractLangCombo->clear();
 | 
			
		||||
 | 
			
		||||
  auto names = Tesseract::availableLanguageNames(ui->tessdataPath->text());
 | 
			
		||||
  if (names.isEmpty())
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  std::sort(names.begin(), names.end());
 | 
			
		||||
  ui->tesseractLangCombo->addItems(names);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SettingsEditor::updateTranslators()
 | 
			
		||||
{
 | 
			
		||||
  ui->translatorList->clear();
 | 
			
		||||
@ -238,22 +232,14 @@ void SettingsEditor::updateTranslators()
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SettingsEditor::updateTranslationLanguages()
 | 
			
		||||
{
 | 
			
		||||
  ui->translateLangCombo->clear();
 | 
			
		||||
 | 
			
		||||
  auto names = Translator::availableLanguageNames();
 | 
			
		||||
  if (names.isEmpty())
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  std::sort(names.begin(), names.end());
 | 
			
		||||
  ui->translateLangCombo->addItems(names);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SettingsEditor::adjustUpdatesView()
 | 
			
		||||
{
 | 
			
		||||
  ui->updatesView->resizeColumnToContents(int(update::Model::Column::Name));
 | 
			
		||||
  updateTesseractLanguages();
 | 
			
		||||
 | 
			
		||||
  if (ui->tessdataPath->text().isEmpty())  // not inited yet
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  updateModels(ui->tessdataPath->text());
 | 
			
		||||
  updateTranslators();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -287,8 +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();
 | 
			
		||||
  updateModels(settings.tessdataPath);
 | 
			
		||||
  updateTranslators();
 | 
			
		||||
 | 
			
		||||
  const auto portableChanged = wasPortable_ != settings.isPortable();
 | 
			
		||||
@ -304,3 +289,10 @@ void SettingsEditor::updateResultFont()
 | 
			
		||||
  font.setPointSize(ui->resultFontSize->value());
 | 
			
		||||
  ui->resultFont->setFont(font);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SettingsEditor::updateModels(const QString &tessdataPath)
 | 
			
		||||
{
 | 
			
		||||
  const auto source = ui->tesseractLangCombo->currentText();
 | 
			
		||||
  models_.update(tessdataPath);
 | 
			
		||||
  ui->tesseractLangCombo->setCurrentText(source);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -2,6 +2,7 @@
 | 
			
		||||
 | 
			
		||||
#include <QDialog>
 | 
			
		||||
 | 
			
		||||
#include "commonmodels.h"
 | 
			
		||||
#include "settings.h"
 | 
			
		||||
 | 
			
		||||
namespace Ui
 | 
			
		||||
@ -23,17 +24,17 @@ public:
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  void updateCurrentPage();
 | 
			
		||||
  void updateTesseractLanguages();
 | 
			
		||||
  void updateTranslators();
 | 
			
		||||
  void updateTranslationLanguages();
 | 
			
		||||
  void adjustUpdatesView();
 | 
			
		||||
  void handleButtonBoxClicked(QAbstractButton *button);
 | 
			
		||||
  void handlePortableChanged();
 | 
			
		||||
  void updateResultFont();
 | 
			
		||||
  void updateModels(const QString &tessdataPath);
 | 
			
		||||
 | 
			
		||||
  Ui::SettingsEditor *ui;
 | 
			
		||||
  Manager &manager_;
 | 
			
		||||
  update::Loader &updater_;
 | 
			
		||||
  CommonModels models_;
 | 
			
		||||
  QStringList enabledTranslators_;
 | 
			
		||||
  bool wasPortable_{false};
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@ -18,6 +18,7 @@ class Recognizer;
 | 
			
		||||
class CaptureArea;
 | 
			
		||||
class CaptureAreaSelector;
 | 
			
		||||
class CaptureAreaEditor;
 | 
			
		||||
class CommonModels;
 | 
			
		||||
 | 
			
		||||
namespace update
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,6 @@
 | 
			
		||||
#include "substitutionstable.h"
 | 
			
		||||
#include "debug.h"
 | 
			
		||||
#include "languagecodes.h"
 | 
			
		||||
#include "tesseract.h"
 | 
			
		||||
 | 
			
		||||
#include <QComboBox>
 | 
			
		||||
#include <QPainter>
 | 
			
		||||
@ -29,7 +28,7 @@ public:
 | 
			
		||||
 | 
			
		||||
SubstitutionsTable::SubstitutionsTable(QWidget *parent)
 | 
			
		||||
  : QTableWidget(parent)
 | 
			
		||||
  , languagesModel_(new QStringListModel(this))
 | 
			
		||||
  , substitutionLanguages_(new QStringListModel(this))
 | 
			
		||||
{
 | 
			
		||||
  setItemDelegate(new SubstitutionDelegate(this));
 | 
			
		||||
  setColumnCount(int(Column::Count));
 | 
			
		||||
@ -38,6 +37,16 @@ SubstitutionsTable::SubstitutionsTable(QWidget *parent)
 | 
			
		||||
          this, &SubstitutionsTable::handleItemChange);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SubstitutionsTable::setSourceLanguageModel(QStringListModel *model)
 | 
			
		||||
{
 | 
			
		||||
  sourceLanguages_ = model;
 | 
			
		||||
  connect(model, &QStringListModel::modelReset,  //
 | 
			
		||||
          this, [this] {
 | 
			
		||||
            if (rowCount() > 0)  // must be at least 1 if inited
 | 
			
		||||
              setSubstitutions(substitutions());
 | 
			
		||||
          });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SubstitutionsTable::setSubstitutions(const Substitutions &substitutions)
 | 
			
		||||
{
 | 
			
		||||
  setRowCount(0);
 | 
			
		||||
@ -50,17 +59,9 @@ void SubstitutionsTable::setSubstitutions(const Substitutions &substitutions)
 | 
			
		||||
  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_);
 | 
			
		||||
  auto strings = sourceLanguages_->stringList();
 | 
			
		||||
 | 
			
		||||
  if (!substitutions.empty()) {
 | 
			
		||||
    for (const auto &i : substitutions) {
 | 
			
		||||
@ -73,7 +74,7 @@ void SubstitutionsTable::updateModel(const Substitutions &substitutions)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  std::sort(strings.begin(), strings.end());
 | 
			
		||||
  languagesModel_->setStringList(strings);
 | 
			
		||||
  substitutionLanguages_->setStringList(strings);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Substitutions SubstitutionsTable::substitutions() const
 | 
			
		||||
@ -97,7 +98,7 @@ void SubstitutionsTable::addRow(const LanguageId &language,
 | 
			
		||||
  insertRow(row);
 | 
			
		||||
 | 
			
		||||
  auto combo = new QComboBox(this);
 | 
			
		||||
  combo->setModel(languagesModel_);
 | 
			
		||||
  combo->setModel(substitutionLanguages_);
 | 
			
		||||
 | 
			
		||||
  using E = Column;
 | 
			
		||||
  if (!language.isEmpty()) {
 | 
			
		||||
 | 
			
		||||
@ -14,8 +14,9 @@ public:
 | 
			
		||||
 | 
			
		||||
  explicit SubstitutionsTable(QWidget* parent = nullptr);
 | 
			
		||||
 | 
			
		||||
  void setSourceLanguageModel(QStringListModel* model);
 | 
			
		||||
 | 
			
		||||
  void setSubstitutions(const Substitutions& substitutions);
 | 
			
		||||
  void setTessdataPath(const QString& tessdataPath);
 | 
			
		||||
  Substitutions substitutions() const;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
@ -25,6 +26,6 @@ private:
 | 
			
		||||
  std::pair<LanguageId, Substitution> at(int row) const;
 | 
			
		||||
  void updateModel(const Substitutions& substitutions);
 | 
			
		||||
 | 
			
		||||
  QStringListModel* languagesModel_;
 | 
			
		||||
  QString tessdataPath_;
 | 
			
		||||
  QStringListModel* sourceLanguages_{nullptr};
 | 
			
		||||
  QStringListModel* substitutionLanguages_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user