From b33a60d09884dc3a6fe6b9a4f4f1bbb9cca81bd2 Mon Sep 17 00:00:00 2001 From: Ugnius Date: Thu, 14 Jun 2018 10:04:54 +0200 Subject: [PATCH] Added APISettings class. Implemented functionality of Settings Dialog. --- src/CMakeLists.txt | 2 + src/apis/googleapi.cpp | 4 +- src/dialogs/settingsdialog.cpp | 63 +++++++++++++++++ src/dialogs/settingsdialog.h | 38 ++++++++++ src/dialogs/settingsdialog.ui | 2 +- src/mainwindow.cpp | 8 +-- src/mainwindow.h | 1 - src/resources.qrc | 1 - src/resources/configs/api.ini | 3 - src/utils/apisettings.cpp | 82 +++++++++++++++++++++ src/utils/apisettings.h | 125 +++++++++++++++++++++++++++++++++ src/utils/language.cpp | 10 +-- src/utils/language.h | 10 +-- 13 files changed, 326 insertions(+), 23 deletions(-) delete mode 100644 src/resources/configs/api.ini create mode 100644 src/utils/apisettings.cpp create mode 100644 src/utils/apisettings.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 308eaff..19ae777 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -45,6 +45,8 @@ set(SOURCE_FILES dialogs/settingsdialog.cpp dialogs/settingsdialog.h dialogs/settingsdialog.ui + utils/apisettings.cpp + utils/apisettings.h utils/language.cpp utils/language.h utils/requestmanager.cpp diff --git a/src/apis/googleapi.cpp b/src/apis/googleapi.cpp index 88f7c91..c3e2f42 100644 --- a/src/apis/googleapi.cpp +++ b/src/apis/googleapi.cpp @@ -14,7 +14,7 @@ QString GoogleAPI::translate(const QString &input, return QString(); } - QSettings settings(":/resources/configs/api.ini", QSettings::IniFormat); + QSettings settings; QString key = settings.value("google/key").toString(); QString format = settings.value("google/format").toString(); @@ -73,7 +73,7 @@ QString GoogleAPI::translate(const QString &input, } QStringList GoogleAPI::getSupportedLanguages() const { - QSettings settings(":/resources/configs/api.ini", QSettings::IniFormat); + QSettings settings; QString key = settings.value("google/key").toString(); // Format GET url string. diff --git a/src/dialogs/settingsdialog.cpp b/src/dialogs/settingsdialog.cpp index 8327e65..d02e0e8 100644 --- a/src/dialogs/settingsdialog.cpp +++ b/src/dialogs/settingsdialog.cpp @@ -5,8 +5,71 @@ SettingsDialog::SettingsDialog(QWidget *parent) : QDialog(parent), ui(new Ui::SettingsDialog) { 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); + } } SettingsDialog::~SettingsDialog() { delete ui; } + +void SettingsDialog::on_apisListWidget_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous) { + int currentIndex = apiSettingsListWidgetItemList.indexOf(current); + + if (currentIndex >= 0) { + APISettings *apiSettings = apiSettingsList.at(currentIndex); + ui->apiKeyLineEdit->setText(apiSettings->getApiKey()); + ui->defaultSourceLanguageLineEdit->setText(apiSettings->getDefaultSourceLanguage()); + ui->defaultTargetLanguageLineEdit->setText(apiSettings->getDefaultTargetLanguage()); + } +} + +void SettingsDialog::on_settingsButtonBox_accepted() { + save(); +} + +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_defaultSourceLanguageLineEdit_textChanged() { + int currentIndex = apiSettingsListWidgetItemList.indexOf(ui->apisListWidget->currentItem()); + + if (currentIndex >= 0) { + APISettings *apiSettings = apiSettingsList.at(currentIndex); + apiSettings->setDefaultSourceLanguage(ui->defaultSourceLanguageLineEdit->text()); + } +} + +void SettingsDialog::on_defaultTargetLanguageLineEdit_textChanged() { + int currentIndex = apiSettingsListWidgetItemList.indexOf(ui->apisListWidget->currentItem()); + + 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(); + } +} diff --git a/src/dialogs/settingsdialog.h b/src/dialogs/settingsdialog.h index 69408e0..6e96b78 100644 --- a/src/dialogs/settingsdialog.h +++ b/src/dialogs/settingsdialog.h @@ -2,6 +2,8 @@ #define INSTANT_TRANSLATOR_SETTINGSDIALOG_H #include +#include +#include "utils/apisettings.h" namespace Ui { class SettingsDialog; @@ -25,8 +27,44 @@ Q_OBJECT */ ~SettingsDialog(); +private slots: + + /** + * On apisListWidget is current item changed. + * @param current Current list item. + * @param previous Previous list item. + */ + void on_apisListWidget_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous); + + /** + * On settingsButtonBox is accepted. + */ + void on_settingsButtonBox_accepted(); + + /** + * On apiKeyLineEdit is text changed. + */ + void on_apiKeyLineEdit_textChanged(); + + /** + * On apiKeyLineEdit is text changed. + */ + void on_defaultSourceLanguageLineEdit_textChanged(); + + /** + * On apiKeyLineEdit is text changed. + */ + void on_defaultTargetLanguageLineEdit_textChanged(); + private: + /** + * Save settings data. + */ + void save(); + Ui::SettingsDialog *ui; + QList apiSettingsList; + QList apiSettingsListWidgetItemList; }; #endif // INSTANT_TRANSLATOR_SETTINGSDIALOG_H diff --git a/src/dialogs/settingsdialog.ui b/src/dialogs/settingsdialog.ui index 686dcf9..6aeabc5 100644 --- a/src/dialogs/settingsdialog.ui +++ b/src/dialogs/settingsdialog.ui @@ -41,7 +41,7 @@ APIs Settings - + 10 diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 4575b58..a6c559c 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -20,8 +20,6 @@ MainWindow::MainWindow(QWidget *parent) : // Load supported languages in the combo boxes. loadLanguagesInComboBoxes(); - - settingsDialog = new SettingsDialog(this); } MainWindow::~MainWindow() { @@ -170,9 +168,9 @@ void MainWindow::on_exitAction_triggered() { } void MainWindow::on_settingsAction_triggered() { - if (settingsDialog) { - settingsDialog->show(); - } + SettingsDialog *settingsDialog = new SettingsDialog(this); + settingsDialog->setAttribute(Qt::WA_DeleteOnClose); + settingsDialog->exec(); } void MainWindow::on_translateButton_clicked() { diff --git a/src/mainwindow.h b/src/mainwindow.h index 0eb1575..acd0d99 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -108,7 +108,6 @@ private slots: void showErrorBox(const QString &message); Ui::MainWindow *ui; // MainWindow user interface. - SettingsDialog *settingsDialog; QClipboard *clipboard; // Clipboard information. API *api; // Translation API. Language language; // Language. diff --git a/src/resources.qrc b/src/resources.qrc index 4dff053..4f63fa3 100644 --- a/src/resources.qrc +++ b/src/resources.qrc @@ -1,7 +1,6 @@ - resources/configs/api.ini resources/languages.json \ No newline at end of file diff --git a/src/resources/configs/api.ini b/src/resources/configs/api.ini deleted file mode 100644 index 5dc3c4e..0000000 --- a/src/resources/configs/api.ini +++ /dev/null @@ -1,3 +0,0 @@ -[google] -key=GOOGLE_API_KEY -format=text diff --git a/src/utils/apisettings.cpp b/src/utils/apisettings.cpp new file mode 100644 index 0000000..eb08b08 --- /dev/null +++ b/src/utils/apisettings.cpp @@ -0,0 +1,82 @@ +#include "apisettings.h" + +APISettings::APISettings(QObject *parent) + : QObject(parent) { +} + +APISettings::APISettings(QObject *parent, const QString &name, const QString &fullName) + : QObject(parent), name(name), fullName(fullName) { +} + +APISettings::~APISettings() { +} + +void APISettings::readSettings() { + if (name == "") { + throw std::invalid_argument("API name has not been set."); + } + QSettings settings; + apiKey = settings.value(name + "/key", "API_KEY").toString(); + textType = settings.value(name + "/text_type", "text").toString(); + defaultSourceLanguage = settings.value(name + "/source", "lt").toString(); + defaultTargetLanguage = settings.value(name + "/target", "en").toString(); +} + +void APISettings::writeSettings() { + if (name == "") { + throw std::invalid_argument("API name has not been set."); + } + QSettings settings; + settings.setValue(name + "/key", apiKey); + settings.setValue(name + "/text_type", textType); + settings.setValue(name + "/source", defaultSourceLanguage); + settings.setValue(name + "/target", defaultTargetLanguage); +} + +QString APISettings::getName() const { + return name; +} + +void APISettings::setName(const QString &name) { + this->name = name; +} + +QString APISettings::getFullName() const { + return fullName; +} + +void APISettings::setFullName(const QString &fullName) { + this->fullName = fullName; +} + +QString APISettings::getApiKey() const { + return apiKey; +} + +void APISettings::setApiKey(const QString &apiKey) { + this->apiKey = apiKey; +} + +QString APISettings::getTextType() const { + return textType; +} + +void APISettings::setTextType(const QString &textType) { + this->textType = textType; +} + +QString APISettings::getDefaultSourceLanguage() const { + return defaultSourceLanguage; +} + +void APISettings::setDefaultSourceLanguage(const QString &defaultSourceLanguage) { + this->defaultSourceLanguage = defaultSourceLanguage; +} + +QString APISettings::getDefaultTargetLanguage() const { + return defaultTargetLanguage; +} + +void APISettings::setDefaultTargetLanguage(const QString &defaultTargetLanguage) { + this->defaultTargetLanguage = defaultTargetLanguage; +} diff --git a/src/utils/apisettings.h b/src/utils/apisettings.h new file mode 100644 index 0000000..3722982 --- /dev/null +++ b/src/utils/apisettings.h @@ -0,0 +1,125 @@ +#ifndef INSTANT_TRANSLATOR_APISETTINGS_H +#define INSTANT_TRANSLATOR_APISETTINGS_H + +#include +#include +#include +#include + +/** + * API settings holder class. + */ +class APISettings : 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 APISettings(QObject *parent = nullptr); + + /** + * Constructs an object with parent object parent. + * @param parent parent Parent of an object may be viewed as the object's owner. + * @param name API name. + * @param fullName API full name. + */ + APISettings(QObject *parent, const QString &name, const QString &fullName); + + /** + * Destructor. + */ + ~APISettings() override; + + /** + * Read API settings to app settings. + */ + void readSettings(); + + /** + * Write API settings to app settings. + */ + void writeSettings(); + + /** + * Get API name. + * @return API name. + */ + QString getName() const; + + /** + * Set API name. + * @param name API name. + */ + void setName(const QString &name); + + /** + * Get API full name. + * @return API full name. + */ + QString getFullName() const; + + /** + * Set API full name. + * @param fullName API full name. + */ + void setFullName(const QString &fullName); + + /** + * Get API key. + * @return API key. + */ + QString getApiKey() const; + + /** + * Set API key. + * @param apiKey API key. + */ + void setApiKey(const QString &apiKey); + + /** + * Get translation text type. + * @return Translation text type. + */ + QString getTextType() const; + + /** + * Set translation text type. + * @param textType Translation text type. + */ + void setTextType(const QString &textType); + + /** + * Get default source language code. + * @return Default source language code. + */ + QString getDefaultSourceLanguage() const; + + /** + * Set default source language code. + * @param defaultSourceLanguage Default source language code. + */ + void setDefaultSourceLanguage(const QString &defaultSourceLanguage); + + /** + * Get default target language code. + * @return Default target language code. + */ + QString getDefaultTargetLanguage() const; + + /** + * Set default target language code. + * @param defaultTargetLanguage Default target language code. + */ + void setDefaultTargetLanguage(const QString &defaultTargetLanguage); + +private: + QString name; + QString fullName; + QString apiKey; + QString textType; + QString defaultSourceLanguage; + QString defaultTargetLanguage; +}; + + +#endif //INSTANT_TRANSLATOR_APISETTINGS_H diff --git a/src/utils/language.cpp b/src/utils/language.cpp index 199b11e..b830c09 100644 --- a/src/utils/language.cpp +++ b/src/utils/language.cpp @@ -8,15 +8,15 @@ Language::Language(QObject *parent) Language::~Language() { } -QString Language::getName(QString code) { +QString Language::getName(const QString &code) const { return hash.value(code); } -QString Language::getCode(QString name) { +QString Language::getCode(const QString &name) const { return hash.key(name); } -QStringList Language::getLanguages(QStringList codeList) { +QStringList Language::getLanguages(const QStringList &codeList) const { QStringList nameList; foreach (QString code, codeList) { nameList.append(hash.value(code)); @@ -24,7 +24,7 @@ QStringList Language::getLanguages(QStringList codeList) { return nameList; } -QStringList Language::getCodes(QStringList nameList) { +QStringList Language::getCodes(const QStringList &nameList) const { QStringList codeList; foreach (QString name, nameList) { codeList.append(hash.key(name)); @@ -32,7 +32,7 @@ QStringList Language::getCodes(QStringList nameList) { return codeList; } -void Language::readFromJsonFile(QString jsonFile) { +void Language::readFromJsonFile(const QString &jsonFile) { // Read JSON file. QString jsonString; QFile file; diff --git a/src/utils/language.h b/src/utils/language.h index ee1d9c5..c4603ae 100644 --- a/src/utils/language.h +++ b/src/utils/language.h @@ -32,35 +32,35 @@ class Language : public QObject { * @param code Language code. * @return Language name. */ - QString getName(QString code); + QString getName(const QString &code) const; /** * Get language code. * @param name Language name. * @return Language code. */ - QString getCode(QString name); + QString getCode(const QString &name) const; /** * Get the names of the languages. * @param codeList Language code list. * @return Language name list. */ - QStringList getLanguages(QStringList codeList); + QStringList getLanguages(const QStringList &codeList) const; /** * Get the codes of the languages. * @param nameList Language name list. * @return codeList Language code list. */ - QStringList getCodes(QStringList nameList); + QStringList getCodes(const QStringList &nameList) const; private: /** * Read language code and name from JSON file. * @param jsonFile JSON file path. */ - void readFromJsonFile(QString jsonFile = ":/resources/languages.json"); + void readFromJsonFile(const QString &jsonFile = ":/resources/languages.json"); QHash hash; // . };