diff --git a/src/tools/qtcreatorcrashhandler/CMakeLists.txt b/src/tools/qtcreatorcrashhandler/CMakeLists.txt index fc2a477d06f..a8d81ef892a 100644 --- a/src/tools/qtcreatorcrashhandler/CMakeLists.txt +++ b/src/tools/qtcreatorcrashhandler/CMakeLists.txt @@ -4,7 +4,7 @@ add_qtc_executable(qtcreator_crash_handler SOURCES backtracecollector.cpp backtracecollector.h crashhandler.cpp crashhandler.h - crashhandlerdialog.cpp crashhandlerdialog.h crashhandlerdialog.ui + crashhandlerdialog.cpp crashhandlerdialog.h main.cpp utils.cpp utils.h ) diff --git a/src/tools/qtcreatorcrashhandler/crashhandlerdialog.cpp b/src/tools/qtcreatorcrashhandler/crashhandlerdialog.cpp index 38080a7c1d3..397944eba2e 100644 --- a/src/tools/qtcreatorcrashhandler/crashhandlerdialog.cpp +++ b/src/tools/qtcreatorcrashhandler/crashhandlerdialog.cpp @@ -4,20 +4,26 @@ #include "crashhandlerdialog.h" #include "crashhandler.h" -#include "ui_crashhandlerdialog.h" #include "utils.h" #include #include +#include #include +#include +#include #include #include +#include +#include +#include #include #include #include #include +#include static const char SettingsApplication[] = "QtCreator"; static const char SettingsKeySkipWarningAbortingBacktrace[] @@ -98,53 +104,110 @@ private: } // anonymous -CrashHandlerDialog::CrashHandlerDialog(CrashHandler *handler, - const QString &signalName, - const QString &appName, - QWidget *parent) : - QDialog(parent), - m_crashHandler(handler), - m_ui(new Ui::CrashHandlerDialog) +class CrashHandlerDialogPrivate { - m_ui->setupUi(this); - m_ui->introLabel->setTextFormat(Qt::RichText); - m_ui->introLabel->setOpenExternalLinks(true); - m_ui->debugInfoEdit->setReadOnly(true); - new StacktraceHighlighter(m_ui->debugInfoEdit->document()); + Q_DECLARE_TR_FUNCTIONS(CrashHandlerDialog) - m_ui->progressBar->setMinimum(0); - m_ui->progressBar->setMaximum(0); - m_ui->restartAppCheckBox->setText(tr("&Restart %1 on close").arg(appName)); +public: + CrashHandlerDialogPrivate(CrashHandlerDialog *dialog, CrashHandler *handler) + : q(dialog) + , m_crashHandler(handler) + , m_iconLabel(new QLabel(q)) + , m_introLabel(new QLabel(q)) + , m_progressBar(new QProgressBar(q)) + , m_debugInfoEdit(new QTextEdit(q)) + , m_restartAppCheckBox(new QCheckBox(q)) + , m_clipboardButton(new QPushButton(tr("C&opy to clipboard"), q)) + , m_reportButton(new QPushButton(tr("Report this &bug"), q)) + , m_debugButton(new QPushButton(tr("Attach and &Debug"), q)) + , m_closeButton(new QPushButton(tr("&Close"), q)) + { + m_introLabel->setTextFormat(Qt::RichText); + m_introLabel->setOpenExternalLinks(true); + m_introLabel->setTextInteractionFlags(Qt::LinksAccessibleByMouse | + Qt::TextSelectableByMouse); - const QStyle * const style = QApplication::style(); - m_ui->closeButton->setIcon(style->standardIcon(QStyle::SP_DialogCloseButton)); + const QStyle * const style = QApplication::style(); + const int iconSize = style->pixelMetric(QStyle::PM_MessageBoxIconSize, 0); + const QIcon icon = style->standardIcon(QStyle::SP_MessageBoxCritical); + m_iconLabel->setPixmap(icon.pixmap(iconSize, iconSize)); - const int iconSize = style->pixelMetric(QStyle::PM_MessageBoxIconSize, 0); - QIcon icon = style->standardIcon(QStyle::SP_MessageBoxCritical); - m_ui->iconLabel->setPixmap(icon.pixmap(iconSize, iconSize)); + m_progressBar->setMinimum(0); + m_progressBar->setMaximum(0); - connect(m_ui->copyToClipBoardButton, &QAbstractButton::clicked, - this, &CrashHandlerDialog::copyToClipboardClicked); - connect(m_ui->reportBugButton, &QAbstractButton::clicked, - m_crashHandler, &CrashHandler::openBugTracker); - connect(m_ui->debugAppButton, &QAbstractButton::clicked, - m_crashHandler, &CrashHandler::debugApplication); - connect(m_ui->closeButton, &QAbstractButton::clicked, this, &CrashHandlerDialog::close); + m_debugInfoEdit->setReadOnly(true); + new StacktraceHighlighter(m_debugInfoEdit->document()); + m_restartAppCheckBox->setChecked(true); + m_clipboardButton->setToolTip(tr("Copy the whole contents to clipboard.")); + m_clipboardButton->setEnabled(false); + m_reportButton->setToolTip(tr("Open the bug tracker web site.")); + m_reportButton->setEnabled(false); + m_debugButton->setToolTip(tr("Debug the application with a new instance of Qt Creator. " + "During debugging the crash handler will be hidden.")); + m_closeButton->setToolTip(tr("Quit the handler and the crashed application.")); + m_closeButton->setIcon(style->standardIcon(QStyle::SP_DialogCloseButton)); + + QObject::connect(m_clipboardButton, &QAbstractButton::clicked, q, [this] { + Utils::setClipboardAndSelection(m_debugInfoEdit->toPlainText()); + }); + QObject::connect(m_reportButton, &QAbstractButton::clicked, + m_crashHandler, &CrashHandler::openBugTracker); + QObject::connect(m_debugButton, &QAbstractButton::clicked, + m_crashHandler, &CrashHandler::debugApplication); + QObject::connect(m_closeButton, &QAbstractButton::clicked, q, [this] { + if (m_restartAppCheckBox->isEnabled() && m_restartAppCheckBox->isChecked()) + m_crashHandler->restartApplication(); + QCoreApplication::quit(); + }); + + using namespace Utils::Layouting; + + Column { + Row { m_iconLabel, m_introLabel, st }, + m_progressBar, + m_debugInfoEdit, + m_restartAppCheckBox, + Row { m_clipboardButton, m_reportButton, st, m_debugButton, m_closeButton } + }.attachTo(q); + } + + CrashHandlerDialog *q = nullptr; + + CrashHandler *m_crashHandler = nullptr; + + QLabel *m_iconLabel = nullptr; + QLabel *m_introLabel = nullptr; + QProgressBar *m_progressBar = nullptr; + QTextEdit *m_debugInfoEdit = nullptr; + QCheckBox *m_restartAppCheckBox = nullptr; + QPushButton *m_clipboardButton = nullptr; + QPushButton *m_reportButton = nullptr; + QPushButton *m_debugButton = nullptr; + QPushButton *m_closeButton = nullptr; +}; + +CrashHandlerDialog::CrashHandlerDialog(CrashHandler *handler, const QString &signalName, + const QString &appName, QWidget *parent) + : QDialog(parent) + , d(new CrashHandlerDialogPrivate(this, handler)) +{ + d->m_restartAppCheckBox->setText(tr("&Restart %1 on close").arg(appName)); setApplicationInfo(signalName, appName); + resize(600, 800); } CrashHandlerDialog::~CrashHandlerDialog() { - delete m_ui; + delete d; } bool CrashHandlerDialog::runDebuggerWhileBacktraceNotFinished() { // Check settings. QSettings settings(QSettings::IniFormat, QSettings::UserScope, - QLatin1String(Core::Constants::IDE_SETTINGSVARIANT_STR), - QLatin1String(SettingsApplication)); + QLatin1String(Core::Constants::IDE_SETTINGSVARIANT_STR), + QLatin1String(SettingsApplication)); if (settings.value(QLatin1String(SettingsKeySkipWarningAbortingBacktrace), false).toBool()) return true; @@ -160,7 +223,7 @@ bool CrashHandlerDialog::runDebuggerWhileBacktraceNotFinished() bool checkBoxSetting = false; const QDialogButtonBox::StandardButton button = Utils::CheckableMessageBox::question(this, title, message, checkBoxText, &checkBoxSetting, - QDialogButtonBox::Yes|QDialogButtonBox::No, QDialogButtonBox::No); + QDialogButtonBox::Yes | QDialogButtonBox::No, QDialogButtonBox::No); if (checkBoxSetting) settings.setValue(QLatin1String(SettingsKeySkipWarningAbortingBacktrace), checkBoxSetting); @@ -169,46 +232,44 @@ bool CrashHandlerDialog::runDebuggerWhileBacktraceNotFinished() void CrashHandlerDialog::setToFinalState() { - m_ui->progressBar->hide(); - m_ui->copyToClipBoardButton->setEnabled(true); - m_ui->reportBugButton->setEnabled(true); + d->m_progressBar->hide(); + d->m_clipboardButton->setEnabled(true); + d->m_reportButton->setEnabled(true); } void CrashHandlerDialog::disableRestartAppCheckBox() { - m_ui->restartAppCheckBox->setDisabled(true); + d->m_restartAppCheckBox->setDisabled(true); } void CrashHandlerDialog::disableDebugAppButton() { - m_ui->debugAppButton->setDisabled(true); + d->m_debugButton->setDisabled(true); } void CrashHandlerDialog::setApplicationInfo(const QString &signalName, const QString &appName) { const QString title = tr("%1 has closed unexpectedly (Signal \"%2\")").arg(appName, signalName); - const QString introLabelContents = tr( - "

%1.

" + const QString introLabelContents = tr("

%1.

" "

Please file a bug report with the debug information provided below.

") .arg(title, QLatin1String(URL_BUGTRACKER)); - m_ui->introLabel->setText(introLabelContents); + d->m_introLabel->setText(introLabelContents); setWindowTitle(title); QString revision; #ifdef IDE_REVISION - revision = QLatin1Char(' ') + tr("from revision %1").arg(QString::fromLatin1(Core::Constants::IDE_REVISION_STR).left(10)); + revision = QLatin1Char(' ') + tr("from revision %1") + .arg(QString::fromLatin1(Core::Constants::IDE_REVISION_STR).left(10)); #endif - const QString versionInformation = tr( - "%1 %2%3, based on Qt %4 (%5 bit)\n") + const QString versionInformation = tr("%1 %2%3, based on Qt %4 (%5 bit)\n") .arg(appName, QLatin1String(Core::Constants::IDE_VERSION_LONG), revision, - QLatin1String(QT_VERSION_STR), - QString::number(QSysInfo::WordSize)); - m_ui->debugInfoEdit->append(versionInformation); + QLatin1String(QT_VERSION_STR), QString::number(QSysInfo::WordSize)); + d->m_debugInfoEdit->append(versionInformation); } void CrashHandlerDialog::appendDebugInfo(const QString &chunk) { - m_ui->debugInfoEdit->append(chunk); + d->m_debugInfoEdit->append(chunk); } void CrashHandlerDialog::selectLineWithContents(const QString &text) @@ -216,27 +277,15 @@ void CrashHandlerDialog::selectLineWithContents(const QString &text) // The selected line will be the first line visible. // Go to end. - QTextCursor cursor = m_ui->debugInfoEdit->textCursor(); + QTextCursor cursor = d->m_debugInfoEdit->textCursor(); cursor.movePosition(QTextCursor::End); - m_ui->debugInfoEdit->setTextCursor(cursor); + d->m_debugInfoEdit->setTextCursor(cursor); // Find text by searching backwards. - m_ui->debugInfoEdit->find(text, QTextDocument::FindCaseSensitively | QTextDocument::FindBackward); + d->m_debugInfoEdit->find(text, QTextDocument::FindCaseSensitively | QTextDocument::FindBackward); // Highlight whole line. - cursor = m_ui->debugInfoEdit->textCursor(); + cursor = d->m_debugInfoEdit->textCursor(); cursor.select(QTextCursor::LineUnderCursor); - m_ui->debugInfoEdit->setTextCursor(cursor); -} - -void CrashHandlerDialog::copyToClipboardClicked() -{ - Utils::setClipboardAndSelection(m_ui->debugInfoEdit->toPlainText()); -} - -void CrashHandlerDialog::close() -{ - if (m_ui->restartAppCheckBox->isEnabled() && m_ui->restartAppCheckBox->isChecked()) - m_crashHandler->restartApplication(); - QCoreApplication::quit(); + d->m_debugInfoEdit->setTextCursor(cursor); } diff --git a/src/tools/qtcreatorcrashhandler/crashhandlerdialog.h b/src/tools/qtcreatorcrashhandler/crashhandlerdialog.h index cd17058c044..173c28ab548 100644 --- a/src/tools/qtcreatorcrashhandler/crashhandlerdialog.h +++ b/src/tools/qtcreatorcrashhandler/crashhandlerdialog.h @@ -5,22 +5,16 @@ #include -QT_BEGIN_NAMESPACE -class QString; -namespace Ui { class CrashHandlerDialog; } -QT_END_NAMESPACE - class CrashHandler; +class CrashHandlerDialogPrivate; class CrashHandlerDialog : public QDialog { Q_OBJECT public: - explicit CrashHandlerDialog(CrashHandler *handler, - const QString &signalName, - const QString &appName, - QWidget *parent = 0); + CrashHandlerDialog(CrashHandler *handler, const QString &signalName, + const QString &appName, QWidget *parent = nullptr); ~CrashHandlerDialog(); public: @@ -33,9 +27,5 @@ public: bool runDebuggerWhileBacktraceNotFinished(); private: - void copyToClipboardClicked(); - void close(); - - CrashHandler *m_crashHandler; - Ui::CrashHandlerDialog *m_ui; + CrashHandlerDialogPrivate *d; }; diff --git a/src/tools/qtcreatorcrashhandler/crashhandlerdialog.ui b/src/tools/qtcreatorcrashhandler/crashhandlerdialog.ui deleted file mode 100644 index 6ebd87f26bb..00000000000 --- a/src/tools/qtcreatorcrashhandler/crashhandlerdialog.ui +++ /dev/null @@ -1,150 +0,0 @@ - - - CrashHandlerDialog - - - - 0 - 0 - 600 - 800 - - - - - 500 - 300 - - - - Dialog - - - - - - QLayout::SetDefaultConstraint - - - - - Icon - - - - - - - Some useful information here... - - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - 24 - - - - - - - - - - &Restart Qt Creator on close - - - true - - - - - - - - - false - - - Copy the whole contents to clipboard. - - - C&opy to clipboard - - - - - - - false - - - Open the bug tracker web site. - - - Report this &bug - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - true - - - Debug the application with a new instance of Qt Creator. During debugging the crash handler will be hidden. - - - Attach and &Debug - - - - - - - Quit the handler and the crashed application. - - - &Close - - - - - - - - - - diff --git a/src/tools/qtcreatorcrashhandler/qtcreatorcrashhandler.qbs b/src/tools/qtcreatorcrashhandler/qtcreatorcrashhandler.qbs index 4fdc5788705..f3e2ad0529a 100644 --- a/src/tools/qtcreatorcrashhandler/qtcreatorcrashhandler.qbs +++ b/src/tools/qtcreatorcrashhandler/qtcreatorcrashhandler.qbs @@ -13,7 +13,7 @@ QtcTool { files: [ "backtracecollector.cpp", "backtracecollector.h", "crashhandler.cpp", "crashhandler.h", - "crashhandlerdialog.cpp", "crashhandlerdialog.h", "crashhandlerdialog.ui", + "crashhandlerdialog.cpp", "crashhandlerdialog.h", "main.cpp", "utils.cpp", "utils.h" ]