aboutsummaryrefslogtreecommitdiffstats
path: root/SQLiteStudio3/guiSQLiteStudio/dialogs/bugdialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'SQLiteStudio3/guiSQLiteStudio/dialogs/bugdialog.cpp')
-rw-r--r--SQLiteStudio3/guiSQLiteStudio/dialogs/bugdialog.cpp220
1 files changed, 220 insertions, 0 deletions
diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/bugdialog.cpp b/SQLiteStudio3/guiSQLiteStudio/dialogs/bugdialog.cpp
new file mode 100644
index 0000000..8f5d433
--- /dev/null
+++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/bugdialog.cpp
@@ -0,0 +1,220 @@
+#include "bugdialog.h"
+#include "ui_bugdialog.h"
+#include "iconmanager.h"
+#include "uiutils.h"
+#include "common/utils.h"
+#include "sqlitestudio.h"
+#include "mainwindow.h"
+#include "bugreportlogindialog.h"
+#include "services/pluginmanager.h"
+#include "services/bugreporter.h"
+#include "services/notifymanager.h"
+#include <QPushButton>
+#include <QDebug>
+#include <QDesktopServices>
+
+BugDialog::BugDialog(QWidget *parent) :
+ QDialog(parent),
+ ui(new Ui::BugDialog)
+{
+ init();
+}
+
+BugDialog::~BugDialog()
+{
+ delete ui;
+}
+
+void BugDialog::setFeatureRequestMode(bool feature)
+{
+ bugMode = !feature;
+ updateState();
+}
+
+void BugDialog::init()
+{
+ ui->setupUi(this);
+ resize(width(), height() - 50);
+
+ ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("Send"));
+
+ connect(ui->moreDetailsGroup, SIGNAL(toggled(bool)), this, SLOT(updateState()));
+ connect(ui->shortDescriptionEdit, SIGNAL(textChanged(QString)), this, SLOT(validate()));
+ connect(ui->longDescriptionEdit, SIGNAL(textChanged()), this, SLOT(validate()));
+ connect(ui->emailEdit, SIGNAL(textChanged(QString)), this, SLOT(validate()));
+ connect(ui->helpButton, SIGNAL(clicked()), this, SLOT(help()));
+ connect(ui->loginButton, SIGNAL(clicked()), this, SLOT(logIn()));
+
+ ui->versionEdit->setText(SQLITESTUDIO->getVersionString());
+ ui->osEdit->setText(getOsString());
+ ui->pluginsEdit->setText(PLUGINS->getLoadedPluginNames().join(", "));
+
+ user = CFG_CORE.Internal.BugReportUser.get();
+
+ if (CFG_CORE.Internal.BugReportRecentError.get())
+ {
+ ui->shortDescriptionEdit->setText(CFG_CORE.Internal.BugReportRecentTitle.get());
+ ui->longDescriptionEdit->setPlainText(CFG_CORE.Internal.BugReportRecentContents.get());
+ }
+
+ updateState();
+ validate();
+}
+
+QString BugDialog::getMessageAboutReportHistory()
+{
+ return tr("You can see all your reported bugs and ideas by selecting menu '%1' and then '%2'.").arg(MAINWINDOW->getSQLiteStudioMenu()->title())
+ .arg(MAINWINDOW->getAction(MainWindow::BUG_REPORT_HISTORY)->text());
+ return "";
+}
+
+void BugDialog::finishedBugReport(bool success, const QString& errorMsg)
+{
+ if (success)
+ {
+ notifyInfo(tr("A bug report sent successfully.") + " " + getMessageAboutReportHistory());
+ }
+ else
+ {
+ CFG_CORE.Internal.BugReportRecentError.set(true);
+ notifyError(tr("An error occurred while sending a bug report: %1\n%2").arg(errorMsg,
+ tr("You can retry sending. The contents will be restored when you open a report dialog after an error like this.")));
+ }
+}
+
+void BugDialog::finishedFeatureRequest(bool success, const QString& errorMsg)
+{
+ if (success)
+ {
+ notifyInfo(tr("An idea proposal sent successfully.") + " " + getMessageAboutReportHistory());
+ }
+ else
+ {
+ CFG_CORE.Internal.BugReportRecentError.set(true);
+ notifyError(tr("An error occurred while sending an idea proposal: %1\n%2").arg(errorMsg,
+ tr("You can retry sending. The contents will be restored when you open a report dialog after an error like this.")));
+ }
+}
+
+void BugDialog::updateState()
+{
+ ui->scrollArea->setVisible(ui->moreDetailsGroup->isChecked());
+
+ ui->moreDetailsGroup->setVisible(bugMode);
+ if (bugMode)
+ {
+ setWindowTitle(tr("A bug report"));
+ ui->shortDescriptionEdit->setPlaceholderText(tr("Describe problem in few words"));
+ ui->longDescriptionEdit->setPlaceholderText(tr("Describe problem and how to reproduce it"));
+ }
+ else
+ {
+ setWindowTitle(tr("A new feature idea"));
+ ui->shortDescriptionEdit->setPlaceholderText(tr("A title for your idea"));
+ ui->longDescriptionEdit->setPlaceholderText(tr("Describe your idea in more details"));
+ }
+
+ if (user.isNull())
+ {
+ ui->currentLoginLabel->setToolTip(tr("Reporting as an unregistered user, using e-mail address."));
+ ui->currentLoginLabel->setPixmap(ICONS.USER_UNKNOWN);
+ ui->emailEdit->setEnabled(true);
+ ui->emailEdit->clear();
+ ui->loginButton->setText(tr("Log in"));
+ ui->loginButton->setIcon(ICONS.USER);
+ }
+ else
+ {
+ ui->currentLoginLabel->setToolTip(tr("Reporting as a registered user."));
+ ui->currentLoginLabel->setPixmap(ICONS.USER);
+ ui->emailEdit->setText(user);
+ ui->emailEdit->setEnabled(false);
+ ui->loginButton->setText(tr("Log out"));
+ ui->loginButton->setIcon(ICONS.USER_UNKNOWN);
+ }
+}
+
+void BugDialog::validate()
+{
+ bool emailOk = !user.isNull() || validateEmail(ui->emailEdit->text());
+ int shortSize = ui->shortDescriptionEdit->text().trimmed().size();
+ int longSize = ui->longDescriptionEdit->toPlainText().trimmed().size();
+ bool shortOk = shortSize >= 10 && shortSize <= 100;
+ bool longOk = longSize >= 30;
+
+ setValidStateWihtTooltip(ui->emailEdit, tr("Providing true email address will make it possible to contact you regarding your report. "
+ "To learn more, press 'help' button on the right side."),
+ emailOk, tr("Enter vaild e-mail address, or log in."));
+
+ setValidState(ui->shortDescriptionEdit, shortOk, tr("Short description requires at least 10 characters, but not more than 100. "
+ "Longer description can be entered in the field below."));
+
+ setValidState(ui->longDescriptionEdit, longOk, tr("Long description requires at least 30 characters."));
+
+ bool valid = shortOk && longOk && emailOk;
+ ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(valid);
+}
+
+void BugDialog::help()
+{
+ if (user.isNull())
+ QDesktopServices::openUrl(QUrl(BUGS->getReporterEmailHelpUrl()));
+ else
+ QDesktopServices::openUrl(QUrl(BUGS->getReporterUserAndPasswordHelpUrl()));
+}
+
+void BugDialog::logIn()
+{
+ if (!user.isNull())
+ {
+ // Log out
+ user = QString();
+ updateState();
+ BUGS->clearBugReportCredentials();
+ return;
+ }
+
+ BugReportLoginDialog dialog(this);
+ if (dialog.exec() != QDialog::Accepted)
+ return;
+
+ if (!dialog.isValid())
+ return;
+
+ BUGS->useBugReportCredentials(dialog.getLogin(), dialog.getPassword());
+ user = dialog.getLogin();
+ updateState();
+}
+
+void BugDialog::accept()
+{
+ CFG_CORE.Internal.BugReportRecentError.set(false);
+ CFG_CORE.Internal.BugReportRecentTitle.set(ui->shortDescriptionEdit->text());
+ CFG_CORE.Internal.BugReportRecentContents.set(ui->longDescriptionEdit->toPlainText());
+
+ if (bugMode)
+ {
+ if (user.isNull())
+ {
+ BUGS->reportBug(ui->emailEdit->text(), ui->shortDescriptionEdit->text(), ui->longDescriptionEdit->toPlainText(), ui->versionEdit->text(),
+ ui->osEdit->text(), ui->pluginsEdit->text(), BugDialog::finishedBugReport);
+ }
+ else
+ {
+ BUGS->reportBug(ui->shortDescriptionEdit->text(), ui->longDescriptionEdit->toPlainText(), ui->versionEdit->text(), ui->osEdit->text(), ui->pluginsEdit->text(),
+ BugDialog::finishedFeatureRequest);
+ }
+ }
+ else
+ {
+ if (user.isNull())
+ {
+ BUGS->requestFeature(ui->emailEdit->text(), ui->shortDescriptionEdit->text(), ui->longDescriptionEdit->toPlainText(), BugDialog::finishedFeatureRequest);
+ }
+ else
+ {
+ BUGS->requestFeature(ui->shortDescriptionEdit->text(), ui->longDescriptionEdit->toPlainText(), BugDialog::finishedFeatureRequest);
+ }
+ }
+ QDialog::accept();
+}