From 718433d27e5fba28e2998dffca08aae72bebf715 Mon Sep 17 00:00:00 2001 From: hjk <qtc-committer@nokia.com> Date: Tue, 21 Sep 2010 16:32:43 +0200 Subject: [PATCH] debugger: add a somewhat more generic breakpoint creation dialog --- src/plugins/debugger/breakhandler.cpp | 12 ++- src/plugins/debugger/breakpoint.ui | 33 ++----- src/plugins/debugger/breakwindow.cpp | 105 +++++++++++++++++++---- src/plugins/debugger/breakwindow.h | 3 +- src/plugins/debugger/debugger.pro | 5 ++ src/plugins/debugger/debuggerconstants.h | 1 + 6 files changed, 115 insertions(+), 44 deletions(-) diff --git a/src/plugins/debugger/breakhandler.cpp b/src/plugins/debugger/breakhandler.cpp index 8b6762c6800..f5a14f1bdde 100644 --- a/src/plugins/debugger/breakhandler.cpp +++ b/src/plugins/debugger/breakhandler.cpp @@ -444,6 +444,17 @@ bool BreakHandler::setData(const QModelIndex &index, const QVariant &value, int QTC_ASSERT(m_engine, return false); m_engine->breakByFunctionMain(); return true; + + case RequestBreakpointRole: + QTC_ASSERT(m_engine, return false); + BreakpointData *data = value.value<BreakpointData *>(); + if (data->funcName == "main") { + m_engine->breakByFunctionMain(); + } else { + appendBreakpoint(data); + m_engine->attemptBreakpointSynchronization(); + } + return true; } BreakpointData *data = at(index.row()); @@ -676,7 +687,6 @@ bool BreakHandler::isActive() const void BreakHandler::initializeFromTemplate(BreakHandler *other) { - //qDebug() << "COPYING BREAKPOINTS INTO NEW SESSION"; QTC_ASSERT(m_bp.isEmpty(), /**/); foreach (BreakpointData *data, other->m_bp) { append(data->clone()); diff --git a/src/plugins/debugger/breakpoint.ui b/src/plugins/debugger/breakpoint.ui index e2198ea2e47..f9e09010ba3 100644 --- a/src/plugins/debugger/breakpoint.ui +++ b/src/plugins/debugger/breakpoint.ui @@ -1,13 +1,13 @@ <?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> - <class>Dialog</class> - <widget class="QDialog" name="Dialog"> + <class>BreakpointDialog</class> + <widget class="QDialog" name="BreakpointDialog"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>382</width> - <height>252</height> + <height>280</height> </rect> </property> <property name="windowTitle"> @@ -24,28 +24,7 @@ </widget> </item> <item row="0" column="1"> - <widget class="QComboBox" name="comboBoxType"> - <item> - <property name="text"> - <string>File and Line Number</string> - </property> - </item> - <item> - <property name="text"> - <string>Function Name</string> - </property> - </item> - <item> - <property name="text"> - <string>Function "main()"</string> - </property> - </item> - <item> - <property name="text"> - <string>Address</string> - </property> - </item> - </widget> + <widget class="QComboBox" name="comboBoxType"/> </item> <item row="1" column="0"> <widget class="QLabel" name="labelFileName"> @@ -149,7 +128,7 @@ <connection> <sender>buttonBox</sender> <signal>accepted()</signal> - <receiver>Dialog</receiver> + <receiver>BreakpointDialog</receiver> <slot>accept()</slot> <hints> <hint type="sourcelabel"> @@ -165,7 +144,7 @@ <connection> <sender>buttonBox</sender> <signal>rejected()</signal> - <receiver>Dialog</receiver> + <receiver>BreakpointDialog</receiver> <slot>reject()</slot> <hints> <hint type="sourcelabel"> diff --git a/src/plugins/debugger/breakwindow.cpp b/src/plugins/debugger/breakwindow.cpp index 8725f8456a7..09e885fa622 100644 --- a/src/plugins/debugger/breakwindow.cpp +++ b/src/plugins/debugger/breakwindow.cpp @@ -31,6 +31,7 @@ #include "debuggeractions.h" #include "debuggerconstants.h" +#include "ui_breakpoint.h" #include "ui_breakcondition.h" #include "ui_breakbyfunction.h" @@ -53,6 +54,48 @@ namespace Debugger { namespace Internal { +/////////////////////////////////////////////////////////////////////// +// +// BreakpointDialog +// +/////////////////////////////////////////////////////////////////////// + +class BreakpointDialog : public QDialog, public Ui::BreakpointDialog +{ + Q_OBJECT +public: + explicit BreakpointDialog(QWidget *parent) + : QDialog(parent) + { + setupUi(this); + comboBoxType->insertItem(0, tr("File and Line Number")); + comboBoxType->insertItem(1, tr("Function Name")); + comboBoxType->insertItem(2, tr("Function \"main()\"")); + comboBoxType->insertItem(3, tr("Address")); + connect(comboBoxType, SIGNAL(activated(int)), + SLOT(typeChanged(int))); + } + +public slots: + void typeChanged(int index) + { + const bool isLineVisible = index == 0; + const bool isFunctionVisible = index == 1; + const bool isAddressVisible = index == 3; + labelFileName->setEnabled(isLineVisible); + lineEditFileName->setEnabled(isLineVisible); + labelLineNumber->setEnabled(isLineVisible); + lineEditLineNumber->setEnabled(isLineVisible); + labelFunction->setEnabled(isFunctionVisible); + lineEditFunction->setEnabled(isFunctionVisible); + labelAddress->setEnabled(isAddressVisible); + lineEditAddress->setEnabled(isAddressVisible); + if (index == 2) + lineEditFunction->setText("main"); + } + +}; + /////////////////////////////////////////////////////////////////////// // // BreakByFunctionDialog @@ -142,7 +185,7 @@ void BreakWindow::mouseDoubleClickEvent(QMouseEvent *ev) { QModelIndex indexUnderMouse = indexAt(ev->pos()); if (indexUnderMouse.isValid() && indexUnderMouse.column() >= 4) - editBreakpoint(QModelIndexList() << indexUnderMouse); + editBreakpoints(QModelIndexList() << indexUnderMouse); QTreeView::mouseDoubleClickEvent(ev); } @@ -235,10 +278,12 @@ void BreakWindow::contextMenuEvent(QContextMenuEvent *ev) QAction *pathAction = new QAction(str6, &menu); pathAction->setEnabled(si.size() > 0); - QAction *breakAtFunctionAction = - new QAction(tr("Set Breakpoint at Function..."), this); - QAction *breakAtMainAction = - new QAction(tr("Set Breakpoint at Function \"main\""), this); + QAction *addBreakpointAction = + new QAction(tr("Set Breakpoint..."), this); + //QAction *breakAtFunctionAction = + // new QAction(tr("Set Breakpoint at Function..."), this); + //QAction *breakAtMainAction = + // new QAction(tr("Set Breakpoint at Function \"main\""), this); QAction *breakAtThrowAction = new QAction(tr("Set Breakpoint at \"throw\""), this); QAction *breakAtCatchAction = @@ -255,8 +300,9 @@ void BreakWindow::contextMenuEvent(QContextMenuEvent *ev) menu.addSeparator(); menu.addAction(synchronizeAction); menu.addSeparator(); - menu.addAction(breakAtFunctionAction); - menu.addAction(breakAtMainAction); + //menu.addAction(breakAtFunctionAction); + //menu.addAction(breakAtMainAction); + menu.addAction(addBreakpointAction); if (engineCapabilities & BreakOnThrowAndCatchCapability) { menu.addAction(breakAtThrowAction); menu.addAction(breakAtCatchAction); @@ -285,7 +331,7 @@ void BreakWindow::contextMenuEvent(QContextMenuEvent *ev) else if (act == alwaysAdjustAction) setAlwaysResizeColumnsToContents(!m_alwaysResizeColumnsToContents); else if (act == editBreakpointAction) - editBreakpoint(si); + editBreakpoints(si); else if (act == associateBreakpointAction) associateBreakpoint(si, threadId); else if (act == synchronizeAction) @@ -294,12 +340,14 @@ void BreakWindow::contextMenuEvent(QContextMenuEvent *ev) setBreakpointsEnabled(si, !enabled); else if (act == pathAction) setBreakpointsFullPath(si, !fullpath); - else if (act == breakAtFunctionAction) { - BreakByFunctionDialog dlg(this); - if (dlg.exec()) - setModelData(RequestBreakByFunctionRole, dlg.functionName()); - } else if (act == breakAtMainAction) - setModelData(RequestBreakByFunctionMainRole); + else if (act == addBreakpointAction) + addBreakpoint(); + //else if (act == breakAtFunctionAction) { + // BreakByFunctionDialog dlg(this); + // if (dlg.exec()) + // setModelData(RequestBreakByFunctionRole, dlg.functionName()); + //} else if (act == breakAtMainAction) + // setModelData(RequestBreakByFunctionMainRole); else if (act == breakAtThrowAction) setModelData(RequestBreakByFunctionRole, "__cxa_throw"); else if (act == breakAtCatchAction) @@ -344,7 +392,32 @@ void BreakWindow::deleteBreakpoints(QList<int> list) setModelData(RequestSynchronizeBreakpointsRole); } -void BreakWindow::editBreakpoint(const QModelIndexList &list) +void BreakWindow::addBreakpoint() +{ + BreakpointDialog dialog(this); + if (dialog.exec() == QDialog::Rejected) + return; + BreakpointData *data = new BreakpointData(); + if (!dialog.lineEditAddress->text().isEmpty()) { + bool ok = false; + data->address = dialog.lineEditAddress->text().toULongLong(&ok, 0); + } + if (!dialog.lineEditFunction->text().isEmpty()) + data->funcName = dialog.lineEditFunction->text(); + if (!dialog.lineEditFileName->text().isEmpty()) + data->fileName = dialog.lineEditFileName->text(); + if (!dialog.lineEditFileName->text().isEmpty()) + data->fileName = dialog.lineEditFileName->text(); + if (!dialog.lineEditCondition->text().isEmpty()) + data->condition = dialog.lineEditCondition->text().toUtf8(); + if (!dialog.lineEditIgnoreCount->text().isEmpty()) + data->ignoreCount = dialog.lineEditIgnoreCount->text().toInt(); + if (!dialog.lineEditThreadSpec->text().isEmpty()) + data->threadSpec = dialog.lineEditThreadSpec->text().toUtf8(); + setModelData(RequestBreakpointRole, QVariant::fromValue(data)); +} + +void BreakWindow::editBreakpoints(const QModelIndexList &list) { QDialog dlg(this); Ui::BreakCondition ui; @@ -423,3 +496,5 @@ void BreakWindow::setModelData } // namespace Internal } // namespace Debugger + +#include "breakwindow.moc" diff --git a/src/plugins/debugger/breakwindow.h b/src/plugins/debugger/breakwindow.h index 1e7204ab6c6..2a9e41b7a0d 100644 --- a/src/plugins/debugger/breakwindow.h +++ b/src/plugins/debugger/breakwindow.h @@ -61,7 +61,8 @@ private: void deleteBreakpoints(const QModelIndexList &list); void deleteBreakpoints(QList<int> rows); - void editBreakpoint(const QModelIndexList &list); + void addBreakpoint(); + void editBreakpoints(const QModelIndexList &list); void associateBreakpoint(const QModelIndexList &list, int thread); void setBreakpointsEnabled(const QModelIndexList &list, bool enabled); void setBreakpointsFullPath(const QModelIndexList &list, bool fullpath); diff --git a/src/plugins/debugger/debugger.pro b/src/plugins/debugger/debugger.pro index 6149403215f..bc95ba52fc4 100644 --- a/src/plugins/debugger/debugger.pro +++ b/src/plugins/debugger/debugger.pro @@ -11,9 +11,11 @@ include(debugger_dependencies.pri) DEFINES += DEBUGGER_LIBRARY INCLUDEPATH += $$PWD/../../libs/utils + QT += gui \ network \ script + HEADERS += breakhandler.h \ breakwindow.h \ breakpoint.h \ @@ -91,11 +93,14 @@ FORMS += attachexternaldialog.ui \ attachtcfdialog.ui \ breakbyfunction.ui \ breakcondition.ui \ + breakpoint.ui \ dumperoptionpage.ui \ commonoptionspage.ui \ startexternaldialog.ui \ startremotedialog.ui + RESOURCES += debugger.qrc + false { SOURCES += $$PWD/modeltest.cpp HEADERS += $$PWD/modeltest.h diff --git a/src/plugins/debugger/debuggerconstants.h b/src/plugins/debugger/debuggerconstants.h index 0c021d63946..b1505eb3d28 100644 --- a/src/plugins/debugger/debuggerconstants.h +++ b/src/plugins/debugger/debuggerconstants.h @@ -214,6 +214,7 @@ enum ModelRoles RequestSynchronizeBreakpointsRole, RequestBreakByFunctionRole, RequestBreakByFunctionMainRole, + RequestBreakpointRole, RequestToggleBreakpointRole, RequestToggleBreakpointEnabledRole, RequestContextMenuRole, -- GitLab