From bfe5b520f154051c526d6ba74f70761c026f4ca8 Mon Sep 17 00:00:00 2001 From: Aurindam Jana <aurindam.jana@nokia.com> Date: Tue, 13 Sep 2011 17:26:02 +0200 Subject: [PATCH] QmlDebugger: Added dialog "Attach to QML Port..." The dialog is added to Debug->Start Debugging menu option. It specifies the host and port that the JSDebugClient connects to for listening to debug messages. Change-Id: I7f828c169ff2338f4780025f72182c5fc8784c4a Reviewed-on: http://codereview.qt-project.org/4824 Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com> Reviewed-by: Kai Koehne <kai.koehne@nokia.com> --- src/plugins/debugger/attachtoqmlportdialog.ui | 72 +++++++++++++++++++ src/plugins/debugger/debugger.pro | 3 +- src/plugins/debugger/debuggerconstants.h | 1 + src/plugins/debugger/debuggerdialogs.cpp | 44 ++++++++++++ src/plugins/debugger/debuggerdialogs.h | 19 +++++ src/plugins/debugger/debuggerplugin.cpp | 48 +++++++++++++ src/plugins/debugger/debuggerrunner.cpp | 3 + .../debugger/debuggerstartparameters.h | 3 +- src/plugins/debugger/qml/qmlengine.cpp | 3 +- 9 files changed, 193 insertions(+), 3 deletions(-) create mode 100644 src/plugins/debugger/attachtoqmlportdialog.ui diff --git a/src/plugins/debugger/attachtoqmlportdialog.ui b/src/plugins/debugger/attachtoqmlportdialog.ui new file mode 100644 index 00000000000..2a88bff1e49 --- /dev/null +++ b/src/plugins/debugger/attachtoqmlportdialog.ui @@ -0,0 +1,72 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>AttachToQmlPortDialog</class> + <widget class="QDialog" name="AttachToQmlPortDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>435</width> + <height>133</height> + </rect> + </property> + <property name="windowTitle"> + <string>Start Debugger</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <layout class="QFormLayout" name="formLayout"> + <property name="fieldGrowthPolicy"> + <enum>QFormLayout::FieldsStayAtSizeHint</enum> + </property> + <item row="0" column="0"> + <widget class="QLabel" name="hostLabel"> + <property name="text"> + <string>Host</string> + </property> + <property name="buddy"> + <cstring>hostLineEdit</cstring> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QLineEdit" name="hostLineEdit"> + <property name="text"> + <string notr="true">localhost</string> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="portLabel"> + <property name="text"> + <string>Port</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QSpinBox" name="portSpinBox"> + <property name="maximum"> + <number>65535</number> + </property> + <property name="value"> + <number>3768</number> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui> diff --git a/src/plugins/debugger/debugger.pro b/src/plugins/debugger/debugger.pro index 6500a7e2466..7cbcf1f93e4 100644 --- a/src/plugins/debugger/debugger.pro +++ b/src/plugins/debugger/debugger.pro @@ -119,7 +119,8 @@ FORMS += attachexternaldialog.ui \ commonoptionspage.ui \ startexternaldialog.ui \ startremotedialog.ui \ - startremoteenginedialog.ui + startremoteenginedialog.ui \ + attachtoqmlportdialog.ui RESOURCES += debugger.qrc diff --git a/src/plugins/debugger/debuggerconstants.h b/src/plugins/debugger/debuggerconstants.h index 35ae2fb8f83..cfdadbf127a 100644 --- a/src/plugins/debugger/debuggerconstants.h +++ b/src/plugins/debugger/debuggerconstants.h @@ -126,6 +126,7 @@ enum DebuggerStartMode AttachCrashedExternal, // Attach to crashed process by process id AttachCore, // Attach to a core file AttachToRemote, // Start and attach to a remote process + AttachToQmlPort, // Attach to QML debugging port StartRemoteGdb, // Start gdb itself remotely StartRemoteEngine // Start ipc guest engine on other machine }; diff --git a/src/plugins/debugger/debuggerdialogs.cpp b/src/plugins/debugger/debuggerdialogs.cpp index ea4059378e6..fe4367a9bd9 100644 --- a/src/plugins/debugger/debuggerdialogs.cpp +++ b/src/plugins/debugger/debuggerdialogs.cpp @@ -40,6 +40,7 @@ #include "ui_startexternaldialog.h" #include "ui_startremotedialog.h" #include "ui_startremoteenginedialog.h" +#include "ui_attachtoqmlportdialog.h" #ifdef Q_OS_WIN # include "shared/dbgwinutils.h" @@ -805,6 +806,49 @@ void StartRemoteDialog::updateState() m_ui->serverStartScript->setEnabled(enabled); } +/////////////////////////////////////////////////////////////////////// +// +// AttachToQmlPortDialog +// +/////////////////////////////////////////////////////////////////////// + +AttachToQmlPortDialog::AttachToQmlPortDialog(QWidget *parent) + : QDialog(parent), + m_ui(new Ui::AttachToQmlPortDialog) +{ + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); + m_ui->setupUi(this); + m_ui->buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); + + connect(m_ui->buttonBox, SIGNAL(accepted()), this, SLOT(accept())); + connect(m_ui->buttonBox, SIGNAL(rejected()), this, SLOT(reject())); +} + +AttachToQmlPortDialog::~AttachToQmlPortDialog() +{ + delete m_ui; +} + +void AttachToQmlPortDialog::setHost(const QString &host) +{ + m_ui->hostLineEdit->setText(host); +} + +QString AttachToQmlPortDialog::host() const +{ + return m_ui->hostLineEdit->text(); +} + +void AttachToQmlPortDialog::setPort(const int port) +{ + m_ui->portSpinBox->setValue(port); +} + +int AttachToQmlPortDialog::port() const +{ + return m_ui->portSpinBox->value(); +} + // --------- StartRemoteCdbDialog static inline QString cdbRemoteHelp() { diff --git a/src/plugins/debugger/debuggerdialogs.h b/src/plugins/debugger/debuggerdialogs.h index a225acfc50d..7896fedf816 100644 --- a/src/plugins/debugger/debuggerdialogs.h +++ b/src/plugins/debugger/debuggerdialogs.h @@ -47,6 +47,7 @@ class AttachCoreDialog; class AttachExternalDialog; class StartExternalDialog; class StartRemoteDialog; +class AttachToQmlPortDialog; class StartRemoteEngineDialog; } // namespace Ui @@ -216,6 +217,24 @@ private: Ui::StartRemoteDialog *m_ui; }; +class AttachToQmlPortDialog : public QDialog +{ + Q_OBJECT + +public: + explicit AttachToQmlPortDialog(QWidget *parent); + ~AttachToQmlPortDialog(); + + QString host() const; + void setHost(const QString &host); + + int port() const; + void setPort(const int port); + +private: + Ui::AttachToQmlPortDialog *m_ui; +}; + class StartRemoteCdbDialog : public QDialog { Q_OBJECT diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index fca7ed6a0b7..d1c7e29df6f 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -723,6 +723,7 @@ public slots: void startExternalApplication(); void startRemoteCdbSession(); void startRemoteApplication(); + void attachToQmlPort(); void startRemoteEngine(); void attachExternalApplication(); Q_SLOT void attachExternalApplication(ProjectExplorer::RunControl *rc); @@ -1021,6 +1022,7 @@ public: QAction *m_startAction; QAction *m_startExternalAction; QAction *m_startRemoteAction; + QAction *m_attachToQmlPortAction; QAction *m_startRemoteCdbAction; QAction *m_startRemoteLldbAction; QAction *m_attachExternalAction; @@ -1137,6 +1139,7 @@ DebuggerPluginPrivate::DebuggerPluginPrivate(DebuggerPlugin *plugin) : m_startAction = 0; m_startExternalAction = 0; m_startRemoteAction = 0; + m_attachToQmlPortAction = 0; m_startRemoteCdbAction = 0; m_startRemoteLldbAction = 0; m_attachExternalAction = 0; @@ -1373,6 +1376,7 @@ void DebuggerPluginPrivate::languagesChanged() m_attachCoreAction->setVisible(debuggerIsCPP); m_startRemoteAction->setVisible(debuggerIsCPP); m_detachAction->setVisible(debuggerIsCPP); + m_attachToQmlPortAction->setVisible(m_mainWindow->activeDebugLanguages() & QmlLanguage); } void DebuggerPluginPrivate::debugProject() @@ -1605,6 +1609,39 @@ void DebuggerPluginPrivate::startRemoteApplication() startDebugger(rc); } +void DebuggerPluginPrivate::attachToQmlPort() +{ + DebuggerStartParameters sp; + AttachToQmlPortDialog dlg(mainWindow()); + + const QVariant qmlServerAddress = configValue(_("LastQmlServerAddress")); + if (qmlServerAddress.isValid()) { + dlg.setHost(qmlServerAddress.toString()); + } else { + dlg.setHost(sp.qmlServerAddress); + } + + const QVariant qmlServerPort = configValue(_("LastQmlServerPort")); + if (qmlServerPort.isValid()) { + dlg.setPort(qmlServerPort.toInt()); + } else { + dlg.setPort(sp.qmlServerPort); + } + + if (dlg.exec() != QDialog::Accepted) + return; + + setConfigValue(_("LastQmlServerAddress"), dlg.host()); + setConfigValue(_("LastQmlServerPort"), dlg.port()); + + sp.serverAddress = dlg.host(); + sp.serverPort = dlg.port(); + + sp.startMode = AttachToQmlPort; + if (RunControl *rc = createDebugger(sp)) + startDebugger(rc); +} + void DebuggerPluginPrivate::startRemoteEngine() { DebuggerStartParameters sp; @@ -1971,6 +2008,7 @@ void DebuggerPluginPrivate::setInitialState() m_startExternalAction->setEnabled(true); m_attachExternalAction->setEnabled(true); + m_attachToQmlPortAction->setEnabled(true); m_attachCoreAction->setEnabled(true); m_startRemoteAction->setEnabled(true); m_detachAction->setEnabled(false); @@ -2086,6 +2124,7 @@ void DebuggerPluginPrivate::updateState(DebuggerEngine *engine) } m_startExternalAction->setEnabled(true); + m_attachToQmlPortAction->setEnabled(true); m_attachExternalAction->setEnabled(true); m_attachCoreAction->setEnabled(true); m_startRemoteAction->setEnabled(true); @@ -2833,6 +2872,10 @@ void DebuggerPluginPrivate::extensionsInitialized() act->setText(tr("Start and Attach to Remote Application...")); connect(act, SIGNAL(triggered()), SLOT(startRemoteApplication())); + act = m_attachToQmlPortAction = new QAction(this); + act->setText(tr("Attach to QML Port...")); + connect(act, SIGNAL(triggered()), SLOT(attachToQmlPort())); + #ifdef Q_OS_WIN m_startRemoteCdbAction = new QAction(tr("Attach to Remote CDB Session..."), this); connect(m_startRemoteCdbAction, SIGNAL(triggered()), @@ -2882,6 +2925,11 @@ void DebuggerPluginPrivate::extensionsInitialized() cmd->setAttribute(Command::CA_Hide); mstart->addAction(cmd, CC::G_DEFAULT_ONE); + cmd = am->registerAction(m_attachToQmlPortAction, + "Debugger.AttachToQmlPort", globalcontext); + cmd->setAttribute(Command::CA_Hide); + mstart->addAction(cmd, CC::G_DEFAULT_ONE); + #ifdef WITH_LLDB cmd = am->registerAction(m_startRemoteLldbAction, "Debugger.RemoteLldb", globalcontext); diff --git a/src/plugins/debugger/debuggerrunner.cpp b/src/plugins/debugger/debuggerrunner.cpp index 6dc3e43a6b5..6a91c7d67cb 100644 --- a/src/plugins/debugger/debuggerrunner.cpp +++ b/src/plugins/debugger/debuggerrunner.cpp @@ -475,6 +475,9 @@ static QList<DebuggerEngineType> enginesForMode(DebuggerStartMode startMode, // For now thats the only supported IPC engine. result.push_back(LldbEngineType); break; + case AttachToQmlPort: + result.push_back(QmlEngineType); // Only QML can do this + break; } return result; } diff --git a/src/plugins/debugger/debuggerstartparameters.h b/src/plugins/debugger/debuggerstartparameters.h index 883901f72c7..2ee3f76757f 100644 --- a/src/plugins/debugger/debuggerstartparameters.h +++ b/src/plugins/debugger/debuggerstartparameters.h @@ -39,6 +39,7 @@ #include <utils/ssh/sshconnection.h> #include <utils/environment.h> #include <projectexplorer/abi.h> +#include <projectexplorer/projectexplorerconstants.h> #include <QtCore/QMetaType> @@ -65,7 +66,7 @@ public: useTerminal(false), breakOnMain(false), qmlServerAddress(QLatin1String("127.0.0.1")), - qmlServerPort(0), + qmlServerPort(ProjectExplorer::Constants::QML_DEFAULT_DEBUG_SERVER_PORT), useServerStartScript(false), connParams(Utils::SshConnectionParameters::NoProxy), startMode(NoStartMode), diff --git a/src/plugins/debugger/qml/qmlengine.cpp b/src/plugins/debugger/qml/qmlengine.cpp index f65d8d2f178..6ec45a45c8e 100644 --- a/src/plugins/debugger/qml/qmlengine.cpp +++ b/src/plugins/debugger/qml/qmlengine.cpp @@ -331,7 +331,8 @@ void QmlEngine::runEngine() { QTC_ASSERT(state() == EngineRunRequested, qDebug() << state()); - if (!isSlaveEngine() && startParameters().startMode != AttachToRemote) + if (!isSlaveEngine() && startParameters().startMode != AttachToRemote + && startParameters().startMode != AttachToQmlPort) startApplicationLauncher(); d->m_noDebugOutputTimer.start(); } -- GitLab