diff --git a/CMakeLists.txt b/CMakeLists.txt index 634996d24..09db7c34a 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -292,6 +292,7 @@ set(APP_SOURCES src/gui/plaintoolbutton.cpp src/gui/lineeditwithstatus.cpp src/gui/widgetwithstatus.cpp + src/gui/labelwithstatus.cpp src/gui/messagebox.cpp # CORE sources. @@ -359,6 +360,7 @@ set(APP_HEADERS src/gui/plaintoolbutton.h src/gui/lineeditwithstatus.h src/gui/widgetwithstatus.h + src/gui/labelwithstatus.h src/gui/messagebox.h # CORE headers. diff --git a/src/core/databasefactory.cpp b/src/core/databasefactory.cpp index 5e2046a02..72e8166e6 100644 --- a/src/core/databasefactory.cpp +++ b/src/core/databasefactory.cpp @@ -33,8 +33,8 @@ DatabaseFactory *DatabaseFactory::instance() { return s_instance; } -int DatabaseFactory::mysqlTestConnection(const QString &hostname, int port, - const QString &username, const QString &password) { +DatabaseFactory::MySQLError DatabaseFactory::mysqlTestConnection(const QString &hostname, int port, + const QString &username, const QString &password) { QSqlDatabase database = QSqlDatabase::addDatabase(APP_DB_DRIVER_MYSQL, APP_DB_TEST_MYSQL); @@ -47,29 +47,29 @@ int DatabaseFactory::mysqlTestConnection(const QString &hostname, int port, // Connection succeeded, clean up the mess and return 0. database.close(); removeConnection(APP_DB_TEST_MYSQL); - return 0; + return MySQLOk; } else { // Connection failed, do cleanup and return specific // error code. - int error_code = database.lastError().number(); + MySQLError error_code = static_cast(database.lastError().number()); removeConnection(APP_DB_TEST_MYSQL); return error_code; } } -QString DatabaseFactory::mysqlInterpretErrorCode(int error_code) { +QString DatabaseFactory::mysqlInterpretErrorCode(MySQLError error_code) { switch (error_code) { - case 0: - return QObject::tr("Operation successful."); + case MySQLOk: + return QObject::tr("MySQL server works as expected."); - case 2002: - case 2003: - case 2005: + case MySQLCantConnect: + case MySQLConnectionError: + case MySQLUnknownHost: return QObject::tr("No MySQL server is running in the target destination."); - case 1045: + case MySQLAccessDenied: return QObject::tr("Access denied. Invalid username or password used."); default: diff --git a/src/core/databasefactory.h b/src/core/databasefactory.h index b3efcbab3..443b69837 100644 --- a/src/core/databasefactory.h +++ b/src/core/databasefactory.h @@ -24,6 +24,14 @@ class DatabaseFactory : public QObject { FromSettings }; + enum MySQLError { + MySQLOk = 0, + MySQLAccessDenied = 1045, + MySQLConnectionError = 2002, + MySQLCantConnect = 2003, + MySQLUnknownHost = 2005 + }; + // // GENERAL stuff. // @@ -57,10 +65,10 @@ class DatabaseFactory : public QObject { // Tests if database connection with given data // can be established and returns 0 if it can. // Otherwise returns MySQL-specific error code. - int mysqlTestConnection(const QString &hostname, int port, - const QString &username, const QString &password); + MySQLError mysqlTestConnection(const QString &hostname, int port, + const QString &username, const QString &password); - QString mysqlInterpretErrorCode(int error_code); + QString mysqlInterpretErrorCode(MySQLError error_code); private: // diff --git a/src/core/defs.h.in b/src/core/defs.h.in index e81684631..216307ad6 100755 --- a/src/core/defs.h.in +++ b/src/core/defs.h.in @@ -42,6 +42,12 @@ #define AUTO_UPDATE_INTERVAL 60000 #define STARTUP_UPDATE_DELAY 1500 +#define MYSQL_CODE_OK 0 +#define MYSQL_CODE_NOT_FOUND 2002 +#define MYSQL_CODE_NOT_FOUND 2002 +#define MYSQL_CODE_NOT_FOUND 2002 +#define MYSQL_CODE_NOT_FOUND 2002 + #define APP_DB_TEST_MYSQL "MySQLTest" #define APP_DB_MYSQL_PORT 3306 #define APP_DB_DRIVER_SQLITE "QSQLITE" diff --git a/src/gui/formsettings.cpp b/src/gui/formsettings.cpp index 09c09e52d..0d1d0851d 100755 --- a/src/gui/formsettings.cpp +++ b/src/gui/formsettings.cpp @@ -445,6 +445,10 @@ void FormSettings::loadDataStorage() { onMysqlUsernameChanged(QString()); onMysqlPasswordChanged(QString()); + m_ui->m_lblMysqlTestResult->setLayoutDirection(Qt::RightToLeft); + m_ui->m_lblMysqlTestResult->setStatus(WidgetWithStatus::Information, + tr("No connection test triggered so far.")); + // Load SQLite. m_ui->m_cmbDatabaseDriver->addItem( tr("SQLite (embedded database)"), APP_DB_DRIVER_SQLITE); @@ -510,13 +514,24 @@ void FormSettings::saveDataStorage() { } void FormSettings::mysqlTestConnection() { - int error_code = DatabaseFactory::instance()->mysqlTestConnection(m_ui->m_txtMysqlHostname->lineEdit()->text(), - m_ui->m_spinMysqlPort->value(), - m_ui->m_txtMysqlUsername->lineEdit()->text(), - m_ui->m_txtMysqlPassword->lineEdit()->text()); + DatabaseFactory::MySQLError error_code = DatabaseFactory::instance()->mysqlTestConnection(m_ui->m_txtMysqlHostname->lineEdit()->text(), + m_ui->m_spinMysqlPort->value(), + m_ui->m_txtMysqlUsername->lineEdit()->text(), + m_ui->m_txtMysqlPassword->lineEdit()->text()); - // Let's interpret the result. - m_ui->m_lblMysqlTestResult->setText(DatabaseFactory::instance()->mysqlInterpretErrorCode(error_code)); + switch (error_code) { + case DatabaseFactory::MySQLOk: + m_ui->m_lblMysqlTestResult->setStatus(WidgetWithStatus::Ok, + DatabaseFactory::instance()->mysqlInterpretErrorCode(error_code)); + break; + + default: + m_ui->m_lblMysqlTestResult->setStatus(WidgetWithStatus::Error, + DatabaseFactory::instance()->mysqlInterpretErrorCode(error_code)); + break; + + + } } void FormSettings::onMysqlHostnameChanged(const QString &new_hostname) { diff --git a/src/gui/formsettings.ui b/src/gui/formsettings.ui index 562ae7f3f..938a91966 100644 --- a/src/gui/formsettings.ui +++ b/src/gui/formsettings.ui @@ -17,7 +17,7 @@ - 3 + 1 @@ -223,19 +223,13 @@ Authors of this application are NOT responsible for lost data. - + 0 0 - - No test run so far. - - - true - @@ -1127,6 +1121,12 @@ Authors of this application are NOT responsible for lost data.
lineeditwithstatus.h
1 + + LabelWithStatus + QWidget +
labelwithstatus.h
+ 1 +
diff --git a/src/gui/labelwithstatus.cpp b/src/gui/labelwithstatus.cpp new file mode 100644 index 000000000..caf599bf1 --- /dev/null +++ b/src/gui/labelwithstatus.cpp @@ -0,0 +1,28 @@ +#include "gui/labelwithstatus.h" + +#include "gui/plaintoolbutton.h" + +#include + + +LabelWithStatus::LabelWithStatus(QWidget *parent) + : WidgetWithStatus(parent) { + m_wdgInput = new QLabel(this); + + // Set correct size for the tool button. + int txt_input_height = m_wdgInput->sizeHint().height(); + m_btnStatus->setFixedSize(txt_input_height + 4, txt_input_height + 4); + + // Compose the layout. + m_layout->addWidget(m_wdgInput); + m_layout->addWidget(m_btnStatus); +} + +LabelWithStatus::~LabelWithStatus() { +} + +void LabelWithStatus::setStatus(WidgetWithStatus::StatusType status, + const QString &label_text) { + WidgetWithStatus::setStatus(status, label_text); + label()->setText(label_text); +} diff --git a/src/gui/labelwithstatus.h b/src/gui/labelwithstatus.h new file mode 100644 index 000000000..355f66409 --- /dev/null +++ b/src/gui/labelwithstatus.h @@ -0,0 +1,25 @@ +#ifndef LABELWITHSTATUS_H +#define LABELWITHSTATUS_H + +#include "gui/widgetwithstatus.h" + +#include + + +class LabelWithStatus : public WidgetWithStatus { + Q_OBJECT + + public: + // Constructors and destructors. + explicit LabelWithStatus(QWidget *parent = 0); + virtual ~LabelWithStatus(); + + void setStatus(StatusType status, const QString &label_text); + + // Access to label. + inline QLabel *label() const { + return static_cast(m_wdgInput); + } +}; + +#endif // LABELWITHSTATUS_H