From cacdcf7160ddfdb74a0cd5a6fa1c395b430e2cf5 Mon Sep 17 00:00:00 2001 From: Tim Jenssen Date: Fri, 29 Apr 2016 22:15:30 +0200 Subject: [PATCH] QmlDesigner: improve warning widget code - the "move" code needs to be inside the warning widget, this also fixes the problem of wrong position at startup - the patch removes knowledge about the DesignModeWidget and uses a signal Change-Id: I9a861ab955d16e85d7af36f1b56ddb82578b8da4 Reviewed-by: Thomas Hartmann --- src/plugins/qmldesigner/designmodewidget.cpp | 19 ++++---- src/plugins/qmldesigner/designmodewidget.h | 3 -- .../qmldesigner/documentwarningwidget.cpp | 43 +++++++++++++------ .../qmldesigner/documentwarningwidget.h | 13 +++--- 4 files changed, 47 insertions(+), 31 deletions(-) diff --git a/src/plugins/qmldesigner/designmodewidget.cpp b/src/plugins/qmldesigner/designmodewidget.cpp index 8cd51266036..c8fd98b4286 100644 --- a/src/plugins/qmldesigner/designmodewidget.cpp +++ b/src/plugins/qmldesigner/designmodewidget.cpp @@ -30,9 +30,11 @@ #include "crumblebar.h" #include "documentwarningwidget.h" +#include #include #include +#include #include #include #include @@ -316,6 +318,13 @@ void DesignModeWidget::setup() // warning frame should be not in layout, but still child of the widget m_warningWidget = new DocumentWarningWidget(this); m_warningWidget->setVisible(false); + connect(m_warningWidget, &DocumentWarningWidget::gotoCodeClicked, [=] + (const QString &filePath, int codeLine, int codeColumn) { + Q_ASSERT(textEditor()->textDocument()->filePath().toString() == filePath); + textEditor()->gotoLine(codeLine, codeColumn); + Core::ModeManager::activateMode(Core::Constants::MODE_EDIT); + } + ); QList sideBarItems; QList leftSideBarItems; @@ -447,15 +456,6 @@ ViewManager &DesignModeWidget::viewManager() return QmlDesignerPlugin::instance()->viewManager(); } -void DesignModeWidget::resizeEvent(QResizeEvent *event) -{ - if (m_warningWidget) { - QPoint warningWidgetCenterPoint = m_warningWidget->rect().center(); - m_warningWidget->move(QPoint(event->size().width() / 2, event->size().height() / 2) - warningWidgetCenterPoint); - } - QWidget::resizeEvent(event); -} - void DesignModeWidget::setupNavigatorHistory(Core::IEditor *editor) { if (!m_keepNavigatorHistory) @@ -569,7 +569,6 @@ void DesignModeWidget::showMessageBox(const QList &errors) Q_ASSERT(!errors.isEmpty()); m_warningWidget->setError(errors.first()); m_warningWidget->setVisible(true); - m_warningWidget->move(width() / 2, height() / 2); } CrumbleBar *DesignModeWidget::crumbleBar() const diff --git a/src/plugins/qmldesigner/designmodewidget.h b/src/plugins/qmldesigner/designmodewidget.h index 78954ed3279..4f107e23a85 100644 --- a/src/plugins/qmldesigner/designmodewidget.h +++ b/src/plugins/qmldesigner/designmodewidget.h @@ -94,9 +94,6 @@ private slots: void toolBarOnGoBackClicked(); void toolBarOnGoForwardClicked(); -protected: - void resizeEvent(QResizeEvent *event); - private: // functions enum InitializeStatus { NotInitialized, Initializing, Initialized }; diff --git a/src/plugins/qmldesigner/documentwarningwidget.cpp b/src/plugins/qmldesigner/documentwarningwidget.cpp index fb320a1d738..0be331b73fa 100644 --- a/src/plugins/qmldesigner/documentwarningwidget.cpp +++ b/src/plugins/qmldesigner/documentwarningwidget.cpp @@ -25,22 +25,19 @@ #include "documentwarningwidget.h" -#include "designmodewidget.h" - -#include -#include - #include #include +#include + +#include namespace QmlDesigner { namespace Internal { -DocumentWarningWidget::DocumentWarningWidget(DesignModeWidget *parent) : +DocumentWarningWidget::DocumentWarningWidget(QWidget *parent) : Utils::FakeToolTip(parent), - m_errorMessage(new QLabel(tr("Placeholder"), this)), - m_goToError(new QLabel(this)), - m_designModeWidget(parent) + m_errorMessage(new QLabel(this)), + m_goToError(new QLabel(this)) { setWindowFlags(Qt::Widget); //We only want the visual style from a ToolTip setForegroundRole(QPalette::ToolTipText); @@ -50,9 +47,8 @@ DocumentWarningWidget::DocumentWarningWidget(DesignModeWidget *parent) : m_errorMessage->setForegroundRole(QPalette::ToolTipText); m_goToError->setText(tr("Go to error")); m_goToError->setForegroundRole(QPalette::Link); - connect(m_goToError, &QLabel::linkActivated, this, [=]() { - m_designModeWidget->textEditor()->gotoLine(m_error.line(), m_error.column() - 1); - Core::ModeManager::activateMode(Core::Constants::MODE_EDIT); + connect(m_goToError, &QLabel::linkActivated, this, [=](const QString &/*link*/) { + emit gotoCodeClicked(m_error.url().toLocalFile(), m_error.line(), m_error.column() - 1); }); QVBoxLayout *layout = new QVBoxLayout(this); @@ -60,6 +56,27 @@ DocumentWarningWidget::DocumentWarningWidget(DesignModeWidget *parent) : layout->setSpacing(5); layout->addWidget(m_errorMessage); layout->addWidget(m_goToError, 1, Qt::AlignRight); + + parent->installEventFilter(this); +} + +void DocumentWarningWidget::moveToParentCenter() +{ + move(parentWidget()->rect().center() - rect().center()); +} + +bool DocumentWarningWidget::eventFilter(QObject *object, QEvent *event) +{ + if (event->type() == QEvent::Resize) { + moveToParentCenter(); + } + return QObject::eventFilter(object, event); +} + +void DocumentWarningWidget::showEvent(QShowEvent *event) +{ + moveToParentCenter(); + Utils::FakeToolTip::showEvent(event); } void DocumentWarningWidget::setError(const RewriterError &error) @@ -67,7 +84,7 @@ void DocumentWarningWidget::setError(const RewriterError &error) m_error = error; QString str; if (error.type() == RewriterError::ParseError) { - str = tr("%3 (%1:%2)").arg(QString::number(error.line()), QString::number(error.column()), error.description()); + str = QString("%3 (%1:%2)").arg(error.line()).arg(error.column()).arg(error.description()); m_goToError->show(); } else if (error.type() == RewriterError::InternalError) { str = tr("Internal error (%1)").arg(error.description()); diff --git a/src/plugins/qmldesigner/documentwarningwidget.h b/src/plugins/qmldesigner/documentwarningwidget.h index d4fcf4ce6e4..bd0d0d35498 100644 --- a/src/plugins/qmldesigner/documentwarningwidget.h +++ b/src/plugins/qmldesigner/documentwarningwidget.h @@ -36,22 +36,25 @@ QT_END_NAMESPACE namespace QmlDesigner { namespace Internal { -class DesignModeWidget; - class DocumentWarningWidget : public Utils::FakeToolTip { Q_OBJECT public: - explicit DocumentWarningWidget(DesignModeWidget *parent = 0); + explicit DocumentWarningWidget(QWidget *parent); void setError(const RewriterError &error); - +signals: + void gotoCodeClicked(const QString filePath, int codeLine, int codeColumn); +protected: + bool eventFilter(QObject *object, QEvent *event) override; + void showEvent(QShowEvent *event) override; private: + void moveToParentCenter(); + QLabel *m_errorMessage; QLabel *m_goToError; RewriterError m_error; - DesignModeWidget *m_designModeWidget; }; } // namespace Internal