From 19d9bc5c24390bad99886c8084de524f0842660d Mon Sep 17 00:00:00 2001 From: Ugnius Date: Thu, 14 Jun 2018 15:51:37 +0200 Subject: [PATCH] Added AppSettings and TempAPI classes. --- src/CMakeLists.txt | 4 ++ src/apis/tempapi.cpp | 38 ++++++++++++++++++ src/apis/tempapi.h | 44 ++++++++++++++++++++ src/dialogs/settingsdialog.cpp | 73 +++++++++++++++++----------------- src/dialogs/settingsdialog.h | 34 +++++++++------- src/dialogs/settingsdialog.ui | 2 +- src/mainwindow.cpp | 64 ++++++++++++++++++++++++----- src/mainwindow.h | 17 ++++++-- src/utils/appsettings.cpp | 54 +++++++++++++++++++++++++ src/utils/appsettings.h | 67 +++++++++++++++++++++++++++++++ 10 files changed, 331 insertions(+), 66 deletions(-) create mode 100644 src/apis/tempapi.cpp create mode 100644 src/apis/tempapi.h create mode 100644 src/utils/appsettings.cpp create mode 100644 src/utils/appsettings.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 19ae777..5cfb2e4 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -42,11 +42,15 @@ set(SOURCE_FILES apis/api.h apis/googleapi.cpp apis/googleapi.h + apis/tempapi.cpp + apis/tempapi.h dialogs/settingsdialog.cpp dialogs/settingsdialog.h dialogs/settingsdialog.ui utils/apisettings.cpp utils/apisettings.h + utils/appsettings.cpp + utils/appsettings.h utils/language.cpp utils/language.h utils/requestmanager.cpp diff --git a/src/apis/tempapi.cpp b/src/apis/tempapi.cpp new file mode 100644 index 0000000..1da6359 --- /dev/null +++ b/src/apis/tempapi.cpp @@ -0,0 +1,38 @@ +#include "tempapi.h" + +TempAPI::TempAPI(QObject *parent) + : QObject(parent) { +} + +TempAPI::~TempAPI() { +} + +QString TempAPI::translate(const QString &input, + const QString &sourceLanguage, + const QString &targetLanguage) const { + if (input.isEmpty()) { + return QString(); + } + + QSettings settings; + QString key = settings.value("temp/key").toString(); + QString format = settings.value("temp/format").toString(); + + QString translation = "Some translation."; + + return translation; +} + +QStringList TempAPI::getSupportedLanguages() const { + QSettings settings; + QString key = settings.value("temp/key").toString(); + + QStringList languagesList; + + languagesList.append("en"); + languagesList.append("fr"); + languagesList.append("de"); + languagesList.append("lt"); + + return languagesList; +} diff --git a/src/apis/tempapi.h b/src/apis/tempapi.h new file mode 100644 index 0000000..c9010d9 --- /dev/null +++ b/src/apis/tempapi.h @@ -0,0 +1,44 @@ +#ifndef INSTANT_TRANSLATOR_TEMPAPI_H +#define INSTANT_TRANSLATOR_TEMPAPI_H + +#include +#include +#include "api.h" + +/** + * Temporary API implementation class. + */ +class TempAPI : public QObject, public API { +Q_OBJECT +Q_INTERFACES(API) +public: + /** + * Constructs an object with parent object parent. + * @param parent Parent of an object may be viewed as the object's owner. + */ + explicit TempAPI(QObject *parent = nullptr); + + /** + * Destructor. + */ + ~TempAPI() override; + + /** + * Translate given input. + * @param input Input string. + * @param sourceLanguage Source language code. + * @param targetLanguage Target language code. + * @return Translated string. + */ + QString translate(const QString &input, + const QString &sourceLanguage, + const QString &targetLanguage) const override; + + /** + * Get supported languages. + * @return Supported languages string list. + */ + QStringList getSupportedLanguages() const override; +}; + +#endif // INSTANT_TRANSLATOR_TEMPAPI_H diff --git a/src/dialogs/settingsdialog.cpp b/src/dialogs/settingsdialog.cpp index d02e0e8..c13c802 100644 --- a/src/dialogs/settingsdialog.cpp +++ b/src/dialogs/settingsdialog.cpp @@ -1,35 +1,29 @@ #include "settingsdialog.h" #include "ui_settingsdialog.h" -SettingsDialog::SettingsDialog(QWidget *parent) : +SettingsDialog::SettingsDialog(QWidget *parent, AppSettings *appSettings) : QDialog(parent), - ui(new Ui::SettingsDialog) { + ui(new Ui::SettingsDialog), + appSettings(appSettings) { ui->setupUi(this); - APISettings *googleAPISettings = new APISettings(this, "google", "Google Translate API"); - googleAPISettings->readSettings(); - apiSettingsList.append(googleAPISettings); - - APISettings *tempAPISettings = new APISettings(this, "temp", "Temp"); - tempAPISettings->readSettings(); - apiSettingsList.append(tempAPISettings); - - for (int i = 0; i < apiSettingsList.count(); ++i) { - QListWidgetItem *listWidgetItem = new QListWidgetItem(apiSettingsList.at(i)->getFullName()); - apiSettingsListWidgetItemList.append(listWidgetItem); - ui->apisListWidget->addItem(listWidgetItem); - } + loadSettings(); } SettingsDialog::~SettingsDialog() { delete ui; } +void SettingsDialog::setAppSettings(AppSettings *appSettings) { + this->appSettings = appSettings; + loadSettings(); +} + void SettingsDialog::on_apisListWidget_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous) { int currentIndex = apiSettingsListWidgetItemList.indexOf(current); if (currentIndex >= 0) { - APISettings *apiSettings = apiSettingsList.at(currentIndex); + APISettings *apiSettings = appSettings->getApiSettingsList().at(currentIndex); ui->apiKeyLineEdit->setText(apiSettings->getApiKey()); ui->defaultSourceLanguageLineEdit->setText(apiSettings->getDefaultSourceLanguage()); ui->defaultTargetLanguageLineEdit->setText(apiSettings->getDefaultTargetLanguage()); @@ -37,39 +31,46 @@ void SettingsDialog::on_apisListWidget_currentItemChanged(QListWidgetItem *curre } void SettingsDialog::on_settingsButtonBox_accepted() { - save(); + saveSettings(); } -void SettingsDialog::on_apiKeyLineEdit_textChanged() { - int currentIndex = apiSettingsListWidgetItemList.indexOf(ui->apisListWidget->currentItem()); - - if (currentIndex >= 0) { - APISettings *apiSettings = apiSettingsList.at(currentIndex); - apiSettings->setApiKey(ui->apiKeyLineEdit->text()); +void SettingsDialog::on_settingsButtonBox_clicked(QAbstractButton *button) { + if ((QPushButton *) button == ui->settingsButtonBox->button(QDialogButtonBox::Apply)) { + saveSettings(); } } -void SettingsDialog::on_defaultSourceLanguageLineEdit_textChanged() { +void SettingsDialog::saveSettings() { int currentIndex = apiSettingsListWidgetItemList.indexOf(ui->apisListWidget->currentItem()); if (currentIndex >= 0) { - APISettings *apiSettings = apiSettingsList.at(currentIndex); + APISettings *apiSettings = appSettings->getApiSettingsList().at(currentIndex); + apiSettings->setApiKey(ui->apiKeyLineEdit->text()); apiSettings->setDefaultSourceLanguage(ui->defaultSourceLanguageLineEdit->text()); + apiSettings->setDefaultTargetLanguage(ui->defaultTargetLanguageLineEdit->text()); } -} -void SettingsDialog::on_defaultTargetLanguageLineEdit_textChanged() { - int currentIndex = apiSettingsListWidgetItemList.indexOf(ui->apisListWidget->currentItem()); + int defaultApiIndex = ui->defaultApiComboBox->currentIndex(); + QString defaultApiName = appSettings->getApiSettingsList().at(defaultApiIndex)->getName(); + appSettings->setDefaultApi(defaultApiName); + + appSettings->save(); - if (currentIndex >= 0) { - APISettings *apiSettings = apiSettingsList.at(currentIndex); - apiSettings->setDefaultTargetLanguage(ui->defaultTargetLanguageLineEdit->text()); - } } -void SettingsDialog::save() { - for (int i = 0; i < apiSettingsList.count(); ++i) { - APISettings *apiSettings = apiSettingsList.at(i); - apiSettings->writeSettings(); +void SettingsDialog::loadSettings() { + for (int i = 0; i < appSettings->getApiSettingsList().count(); ++i) { + APISettings *apiSettings = appSettings->getApiSettingsList().at(i); + + QListWidgetItem *listWidgetItem = new QListWidgetItem(apiSettings->getFullName()); + apiSettingsListWidgetItemList.append(listWidgetItem); + ui->apisListWidget->addItem(listWidgetItem); + + ui->defaultApiComboBox->addItem(apiSettings->getFullName()); + QSettings settings; + QString defaultApiName = settings.value("default_api").toString(); + if (apiSettings->getName() == defaultApiName) { + ui->defaultApiComboBox->setCurrentIndex(i); + } } } diff --git a/src/dialogs/settingsdialog.h b/src/dialogs/settingsdialog.h index 6e96b78..6d13ca2 100644 --- a/src/dialogs/settingsdialog.h +++ b/src/dialogs/settingsdialog.h @@ -3,7 +3,10 @@ #include #include +#include +#include #include "utils/apisettings.h" +#include "utils/appsettings.h" namespace Ui { class SettingsDialog; @@ -19,14 +22,21 @@ Q_OBJECT /** * Constructs an object with parent object parent. * @param parent Parent of an object may be viewed as the object's owner. + * @param appSettings App settings. */ - explicit SettingsDialog(QWidget *parent = nullptr); + SettingsDialog(QWidget *parent, AppSettings *appSettings); /** * Destructor. */ ~SettingsDialog(); + /** + * Set App settings. + * @param appSettings App settings. + */ + void setAppSettings(AppSettings *appSettings); + private slots: /** @@ -42,28 +52,24 @@ private slots: void on_settingsButtonBox_accepted(); /** - * On apiKeyLineEdit is text changed. - */ - void on_apiKeyLineEdit_textChanged(); - - /** - * On apiKeyLineEdit is text changed. + * On settingsButtonBox is clicked; + * @param button Button. */ - void on_defaultSourceLanguageLineEdit_textChanged(); + void on_settingsButtonBox_clicked(QAbstractButton *button); +private: /** - * On apiKeyLineEdit is text changed. + * Save settings data. */ - void on_defaultTargetLanguageLineEdit_textChanged(); + void saveSettings(); -private: /** - * Save settings data. + * Load appSettings. */ - void save(); + void loadSettings(); Ui::SettingsDialog *ui; - QList apiSettingsList; + AppSettings *appSettings; QList apiSettingsListWidgetItemList; }; diff --git a/src/dialogs/settingsdialog.ui b/src/dialogs/settingsdialog.ui index 6aeabc5..1b103ea 100644 --- a/src/dialogs/settingsdialog.ui +++ b/src/dialogs/settingsdialog.ui @@ -26,7 +26,7 @@ Qt::Horizontal - QDialogButtonBox::Close|QDialogButtonBox::Ok + QDialogButtonBox::Apply|QDialogButtonBox::Close|QDialogButtonBox::Ok diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index a6c559c..3480c39 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1,5 +1,6 @@ #include "mainwindow.h" #include "ui_mainwindow.h" +#include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), @@ -14,21 +15,33 @@ MainWindow::MainWindow(QWidget *parent) : this, &MainWindow::onClipboardDataChanged ); + // App settings. + appSettings = new AppSettings(this); - // Set Google Translator API. - api = new GoogleAPI(this); + APISettings *googleAPISettings = new APISettings(this, "google", "Google Translate API"); + googleAPISettings->readSettings(); + appSettings->addApiSettings(googleAPISettings); - // Load supported languages in the combo boxes. - loadLanguagesInComboBoxes(); + APISettings *tempAPISettings = new APISettings(this, "temp", "Temp API"); + tempAPISettings->readSettings(); + appSettings->addApiSettings(tempAPISettings); + + // Set default API. + QSettings settings; + appSettings->setDefaultApi(settings.value("default_api", "google").toString()); + + // Load API. + loadApi(); } MainWindow::~MainWindow() { // Save used translation languages. - QSettings settings; + APISettings *currentApiSettings = appSettings->getDefaultApi(); QString sourceLanguage = language.getCode(ui->sourceLanguagesComboBox->currentText()); QString targetLanguage = language.getCode(ui->targetLanguagesComboBox->currentText()); - settings.setValue("source", sourceLanguage); - settings.setValue("target", targetLanguage); + currentApiSettings->setDefaultSourceLanguage(sourceLanguage); + currentApiSettings->setDefaultTargetLanguage(targetLanguage); + appSettings->save(); delete ui; delete api; @@ -45,6 +58,30 @@ void MainWindow::onClipboardDataChanged() { doTranslation(); } +void MainWindow::loadApi() { + if (appSettings == nullptr) { + return; + } + + // TODO(ugnelis): Fix this. +// if (api != nullptr) { +// delete api; +// } + + APISettings *defaultApiSettings = appSettings->getDefaultApi(); + + if (defaultApiSettings->getName() == "google") { + api = new GoogleAPI(); + qDebug() << "google API"; + } else if (defaultApiSettings->getName() == "temp") { + api = new TempAPI(); + qDebug() << "temp API"; + } + + // Load supported languages in the combo boxes. + loadLanguagesInComboBoxes(); +} + void MainWindow::doTranslation() { QString inputString = ui->inputPlainTextEdit->toPlainText(); @@ -81,6 +118,10 @@ void MainWindow::swapLanguagesInComboBoxes() { } void MainWindow::loadLanguagesInComboBoxes() { + // Clear data from the combo boxes. + ui->sourceLanguagesComboBox->clear(); + ui->targetLanguagesComboBox->clear(); + // Get API supported languages. QFutureWatcher *futureWatcher = new QFutureWatcher(this); QFuture future = QtConcurrent::run( @@ -100,9 +141,9 @@ void MainWindow::loadLanguagesInComboBoxes() { ui->targetLanguagesComboBox->addItems(languageNameList); // Load saved translation languages. - QSettings settings; - QString sourceLanguage = settings.value("source", "de").toString(); - QString targetLanguage = settings.value("target", "en").toString(); + APISettings *defaultApiSettings = appSettings->getDefaultApi(); + QString sourceLanguage = defaultApiSettings->getDefaultSourceLanguage(); + QString targetLanguage = defaultApiSettings->getDefaultTargetLanguage(); // Set source language. int sourceLanguageIndex = languageCodeList.indexOf(sourceLanguage); @@ -168,9 +209,10 @@ void MainWindow::on_exitAction_triggered() { } void MainWindow::on_settingsAction_triggered() { - SettingsDialog *settingsDialog = new SettingsDialog(this); + SettingsDialog *settingsDialog = new SettingsDialog(this, appSettings); settingsDialog->setAttribute(Qt::WA_DeleteOnClose); settingsDialog->exec(); + loadApi(); } void MainWindow::on_translateButton_clicked() { diff --git a/src/mainwindow.h b/src/mainwindow.h index acd0d99..2df6540 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -8,11 +8,14 @@ #include #include #include +#include #include #include #include "apis/api.h" #include "apis/googleapi.h" +#include "apis/tempapi.h" #include "dialogs/settingsdialog.h" +#include "utils/appsettings.h" #include "utils/language.h" namespace Ui { @@ -65,6 +68,11 @@ private slots: void on_swapLanguagesButton_clicked(); private: + /** + * Load translation API. + */ + void loadApi(); + /** * Do translation. */ @@ -107,10 +115,11 @@ private slots: */ void showErrorBox(const QString &message); - Ui::MainWindow *ui; // MainWindow user interface. - QClipboard *clipboard; // Clipboard information. - API *api; // Translation API. - Language language; // Language. + Ui::MainWindow *ui; // MainWindow user interface. + QClipboard *clipboard; // Clipboard information. + API *api; // Translation API. + AppSettings *appSettings; // App settings. + Language language; // Language. }; #endif // INSTANT_TRANSLATOR_MAINWINDOW_H diff --git a/src/utils/appsettings.cpp b/src/utils/appsettings.cpp new file mode 100644 index 0000000..b978e65 --- /dev/null +++ b/src/utils/appsettings.cpp @@ -0,0 +1,54 @@ +#include "appsettings.h" + +AppSettings::AppSettings(QObject *parent) + : QObject(parent) { +} + +AppSettings::~AppSettings() { +} + +void AppSettings::addApiSettings(APISettings *apiSettings) { + apiSettings->readSettings(); + apiSettingsList.append(apiSettings); +} + +QList AppSettings::getApiSettingsList() const { + return apiSettingsList; +} + +void AppSettings::setDefaultApi(APISettings *apiSettings) { + int index = apiSettingsList.indexOf(apiSettings); + + if (index < 0) { + apiSettingsList.append(apiSettings); + } + defaultApi = apiSettings; +} + +void AppSettings::setDefaultApi(QString name) { + for (int i = 0; i < apiSettingsList.count(); ++i) { + if (apiSettingsList.at(i)->getName() == name) { + defaultApi = apiSettingsList.at(i); + return; + } + } + + std::string exceptionMessage = "API with name '" + name.toStdString() + "' does not exist"; + throw std::invalid_argument(exceptionMessage); +} + +APISettings *AppSettings::getDefaultApi() { + return defaultApi; +} + +void AppSettings::save() { + for (int i = 0; i < apiSettingsList.count(); ++i) { + APISettings *apiSettings = apiSettingsList.at(i); + apiSettings->writeSettings(); + } + + QSettings settings; + if (defaultApi != nullptr) { + settings.setValue("default_api", defaultApi->getName()); + } +} diff --git a/src/utils/appsettings.h b/src/utils/appsettings.h new file mode 100644 index 0000000..3b4db12 --- /dev/null +++ b/src/utils/appsettings.h @@ -0,0 +1,67 @@ +#ifndef INSTANT_TRANSLATOR_APPSETTINGS_H +#define INSTANT_TRANSLATOR_APPSETTINGS_H + +#include +#include +#include +#include +#include "utils/apisettings.h" + +/** + * App settings holder class. + */ +class AppSettings : public QObject { +public: + /** + * Constructs an object with parent object parent. + * @param parent Parent of an object may be viewed as the object's owner. + */ + explicit AppSettings(QObject *parent = nullptr); + + /** + * Destructor. + */ + ~AppSettings() override; + + /** + * Add API settings. + * @param apiSettings API settings. + */ + void addApiSettings(APISettings *apiSettings); + + /** + * Get API settings list. + * @return API settings list. + */ + QList getApiSettingsList() const; + + /** + * Set default API. + * @param apiSettings API settings. + */ + void setDefaultApi(APISettings *apiSettings); + + /** + * Set default API by giving name. + * @param name API name. + */ + void setDefaultApi(QString name); + + /** + * Get Default API settings. + * @return default API settings. + */ + APISettings *getDefaultApi(); + + /** + * Save app settings + */ + void save(); + +private: + QList apiSettingsList; + APISettings *defaultApi; +}; + + +#endif //INSTANT_TRANSLATOR_APPSETTINGS_H