diff --git a/src/plugins/debugger/breakhandler.cpp b/src/plugins/debugger/breakhandler.cpp index f5a14f1bdde385bb3db0c6f878965c26be8df5f6..e0428f8cf5642d1986b7ffe53b4c602bff530d01 100644 --- a/src/plugins/debugger/breakhandler.cpp +++ b/src/plugins/debugger/breakhandler.cpp @@ -285,6 +285,9 @@ QVariant BreakHandler::data(const QModelIndex &mi, int role) const const BreakpointData *data = at(mi.row()); + if (role == BreakpointRole) + return qulonglong(data); + if (role == BreakpointUseFullPathRole) return data->useFullPath; @@ -502,6 +505,15 @@ bool BreakHandler::setData(const QModelIndex &index, const QVariant &value, int return false; } +void BreakHandler::reinsertBreakpoint(BreakpointData *data) +{ + // FIXME: Use some more direct method? + appendBreakpoint(data->clone()); + removeBreakpoint(data); + m_engine->attemptBreakpointSynchronization(); + emit layoutChanged(); +} + void BreakHandler::append(BreakpointData *data) { data->m_handler = this; diff --git a/src/plugins/debugger/breakhandler.h b/src/plugins/debugger/breakhandler.h index 432bf0a27a87f564e8fa2b53c118f18ffd1826e1..9a9aa30289c79e498f5d249e9b5c8fe21756988e 100644 --- a/src/plugins/debugger/breakhandler.h +++ b/src/plugins/debugger/breakhandler.h @@ -66,7 +66,6 @@ public: BreakpointData *at(int index) const; int size() const { return m_bp.size(); } bool hasPendingBreakpoints() const; - void append(BreakpointData *data); void removeAt(int index); // This also deletes the marker. void clear(); // This also deletes all the marker. int indexOf(BreakpointData *data) { return m_bp.indexOf(data); } @@ -99,6 +98,7 @@ public: public slots: void appendBreakpoint(BreakpointData *data); + void reinsertBreakpoint(BreakpointData *data); void toggleBreakpointEnabled(BreakpointData *data); void breakByFunction(const QString &functionName); void removeBreakpoint(int index); @@ -119,6 +119,7 @@ private: void loadBreakpoints(); void saveBreakpoints(); void removeBreakpointHelper(int index); + void append(BreakpointData *data); const QIcon m_breakpointIcon; const QIcon m_disabledBreakpointIcon; diff --git a/src/plugins/debugger/breakpoint.cpp b/src/plugins/debugger/breakpoint.cpp index 3d45c972b59bd607478dd6dd4d4874c649b2d061..f7dc8a848e22987198a80cb9acb15cd4affe0a2d 100644 --- a/src/plugins/debugger/breakpoint.cpp +++ b/src/plugins/debugger/breakpoint.cpp @@ -364,6 +364,12 @@ bool BreakpointData::conditionsMatch() const return s1 == s2; } +void BreakpointData::reinsertBreakpoint() +{ + QTC_ASSERT(m_handler, return); + m_handler->reinsertBreakpoint(this); +} + } // namespace Internal } // namespace Debugger diff --git a/src/plugins/debugger/breakpoint.h b/src/plugins/debugger/breakpoint.h index ffe6a654dd40dcb08a393b0ac5b1f061e0ae0ff2..7e22ffdb918b281027b1d0b6b1e11388894692e2 100644 --- a/src/plugins/debugger/breakpoint.h +++ b/src/plugins/debugger/breakpoint.h @@ -56,6 +56,7 @@ public: void updateMarker(); QString toToolTip() const; BreakHandler *handler() { return m_handler; } + void reinsertBreakpoint(); bool isLocatedAt(const QString &fileName, int lineNumber, bool useMarkerPosition) const; diff --git a/src/plugins/debugger/breakpoint.ui b/src/plugins/debugger/breakpoint.ui index f9e09010ba37b40c636dd18246c8f255914d0516..e8932ce84cf1647c7aa1be1cb3f967352525f89b 100644 --- a/src/plugins/debugger/breakpoint.ui +++ b/src/plugins/debugger/breakpoint.ui @@ -7,7 +7,7 @@ <x>0</x> <y>0</y> <width>382</width> - <height>280</height> + <height>302</height> </rect> </property> <property name="windowTitle"> @@ -46,55 +46,69 @@ <item row="2" column="1"> <widget class="QLineEdit" name="lineEditLineNumber"/> </item> + <item row="3" column="1"> + <widget class="QCheckBox" name="checkBoxUseFullPath"> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item row="3" column="0"> + <widget class="QLabel" name="labelUseFullPath"> + <property name="text"> + <string>Use full path:</string> + </property> + </widget> + </item> <item row="4" column="0"> - <widget class="QLabel" name="labelFunction"> + <widget class="QLabel" name="labelAddress"> <property name="text"> - <string>Function:</string> + <string>Address:</string> </property> </widget> </item> <item row="4" column="1"> - <widget class="QLineEdit" name="lineEditFunction"/> + <widget class="QLineEdit" name="lineEditAddress"/> </item> <item row="5" column="0"> - <widget class="QLabel" name="labelCondition"> + <widget class="QLabel" name="labelFunction"> <property name="text"> - <string>Condition:</string> + <string>Function:</string> </property> </widget> </item> <item row="5" column="1"> - <widget class="QLineEdit" name="lineEditCondition"/> + <widget class="QLineEdit" name="lineEditFunction"/> </item> <item row="6" column="0"> - <widget class="QLabel" name="labelIgnoreCount"> + <widget class="QLabel" name="labelCondition"> <property name="text"> - <string>Ignore count:</string> + <string>Condition:</string> </property> </widget> </item> <item row="6" column="1"> - <widget class="QLineEdit" name="lineEditIgnoreCount"/> + <widget class="QLineEdit" name="lineEditCondition"/> </item> <item row="7" column="0"> - <widget class="QLabel" name="labelThreadSpec"> + <widget class="QLabel" name="labelIgnoreCount"> <property name="text"> - <string>Thread specification:</string> + <string>Ignore count:</string> </property> </widget> </item> <item row="7" column="1"> - <widget class="QLineEdit" name="lineEditThreadSpec"/> + <widget class="QLineEdit" name="lineEditIgnoreCount"/> </item> - <item row="3" column="0"> - <widget class="QLabel" name="labelAddress"> + <item row="8" column="0"> + <widget class="QLabel" name="labelThreadSpec"> <property name="text"> - <string>Address:</string> + <string>Thread specification:</string> </property> </widget> </item> - <item row="3" column="1"> - <widget class="QLineEdit" name="lineEditAddress"/> + <item row="8" column="1"> + <widget class="QLineEdit" name="lineEditThreadSpec"/> </item> </layout> </item> diff --git a/src/plugins/debugger/breakwindow.cpp b/src/plugins/debugger/breakwindow.cpp index 09e885fa622ce92c3aa639004d527cedd3173615..5492691345d87c683725b52d501fb7b83e55be11 100644 --- a/src/plugins/debugger/breakwindow.cpp +++ b/src/plugins/debugger/breakwindow.cpp @@ -64,7 +64,7 @@ class BreakpointDialog : public QDialog, public Ui::BreakpointDialog { Q_OBJECT public: - explicit BreakpointDialog(QWidget *parent) + explicit BreakpointDialog(QWidget *parent, BreakpointData *data) : QDialog(parent) { setupUi(this); @@ -72,8 +72,21 @@ public: 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))); + lineEditFileName->setText(data->fileName); + lineEditLineNumber->setText(QByteArray::number(data->lineNumber)); + lineEditFunction->setText(data->funcName); + lineEditCondition->setText(data->condition); + lineEditIgnoreCount->setText(QByteArray::number(data->ignoreCount)); + checkBoxUseFullPath->setChecked(data->useFullPath); + if (data->address) + lineEditAddress->setText("0x" + QByteArray::number(data->address, 16)); + int initialType = 0; + if (!data->funcName.isEmpty()) + initialType = lineEditFunction->text() == "main" ? 2 : 1; + if (data->address) + initialType = 3; + typeChanged(initialType); + connect(comboBoxType, SIGNAL(activated(int)), SLOT(typeChanged(int))); } public slots: @@ -86,6 +99,8 @@ public slots: lineEditFileName->setEnabled(isLineVisible); labelLineNumber->setEnabled(isLineVisible); lineEditLineNumber->setEnabled(isLineVisible); + labelUseFullPath->setEnabled(isLineVisible); + checkBoxUseFullPath->setEnabled(isLineVisible); labelFunction->setEnabled(isFunctionVisible); lineEditFunction->setEnabled(isFunctionVisible); labelAddress->setEnabled(isAddressVisible); @@ -279,16 +294,13 @@ void BreakWindow::contextMenuEvent(QContextMenuEvent *ev) pathAction->setEnabled(si.size() > 0); 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); + new QAction(tr("Add Breakpoint..."), this); QAction *breakAtThrowAction = new QAction(tr("Set Breakpoint at \"throw\""), this); QAction *breakAtCatchAction = new QAction(tr("Set Breakpoint at \"catch\""), this); + menu.addAction(addBreakpointAction); menu.addAction(deleteAction); menu.addAction(editBreakpointAction); menu.addAction(associateBreakpointAction); @@ -299,11 +311,8 @@ void BreakWindow::contextMenuEvent(QContextMenuEvent *ev) menu.addAction(deleteByFileAction); menu.addSeparator(); menu.addAction(synchronizeAction); - menu.addSeparator(); - //menu.addAction(breakAtFunctionAction); - //menu.addAction(breakAtMainAction); - menu.addAction(addBreakpointAction); if (engineCapabilities & BreakOnThrowAndCatchCapability) { + menu.addSeparator(); menu.addAction(breakAtThrowAction); menu.addAction(breakAtCatchAction); } @@ -392,41 +401,58 @@ void BreakWindow::deleteBreakpoints(QList<int> list) setModelData(RequestSynchronizeBreakpointsRole); } -void BreakWindow::addBreakpoint() +bool BreakWindow::editBreakpoint(BreakpointData *data) { - BreakpointDialog dialog(this); + BreakpointDialog dialog(this, data); if (dialog.exec() == QDialog::Rejected) - return; - BreakpointData *data = new BreakpointData(); - if (!dialog.lineEditAddress->text().isEmpty()) { - bool ok = false; + return false; + bool ok = false; + if (!dialog.lineEditAddress->text().isEmpty()) data->address = dialog.lineEditAddress->text().toULongLong(&ok, 0); - } + if (!dialog.lineEditFunction->text().isEmpty()) + data->funcName = dialog.lineEditFunction->text(); 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(); + data->lineNumber = dialog.lineEditLineNumber->text().toInt(); + data->useFullPath = dialog.checkBoxUseFullPath->isChecked(); 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)); + return true; +} + +void BreakWindow::addBreakpoint() +{ + BreakpointData *data = new BreakpointData(); + if (editBreakpoint(data)) + setModelData(RequestBreakpointRole, QVariant::fromValue(data)); + else + delete data; } void BreakWindow::editBreakpoints(const QModelIndexList &list) { + if (list.size() == 1) { + QVariant var = model()->data(list.at(0), BreakpointRole); + BreakpointData *data = (BreakpointData *)var.toULongLong(); + if (editBreakpoint(data)) + data->reinsertBreakpoint(); + return; + } + + // This allows to change properties of multiple breakpoints at a time. QDialog dlg(this); Ui::BreakCondition ui; ui.setupUi(&dlg); QTC_ASSERT(!list.isEmpty(), return); QModelIndex idx = list.front(); - const int row = idx.row(); - dlg.setWindowTitle(tr("Conditions on Breakpoint %1").arg(row)); + dlg.setWindowTitle(tr("Edit Breakpoint Properties")); ui.lineEditFunction->hide(); ui.labelFunction->hide(); ui.lineEditFileName->hide(); @@ -436,7 +462,8 @@ void BreakWindow::editBreakpoints(const QModelIndexList &list) QAbstractItemModel *m = model(); ui.lineEditCondition->setText( m->data(idx, BreakpointConditionRole).toString()); - ui.lineEditIgnoreCount->setValidator(new QIntValidator(0, 2147483647, ui.lineEditIgnoreCount)); + ui.lineEditIgnoreCount->setValidator( + new QIntValidator(0, 2147483647, ui.lineEditIgnoreCount)); ui.lineEditIgnoreCount->setText( m->data(idx, BreakpointIgnoreCountRole).toString()); ui.lineEditThreadSpec->setText( diff --git a/src/plugins/debugger/breakwindow.h b/src/plugins/debugger/breakwindow.h index 2a9e41b7a0dce60d0bf8c3595d7483615e35b390..5b6b1cb969b2d72e8a48ff921c0093a3be42a06b 100644 --- a/src/plugins/debugger/breakwindow.h +++ b/src/plugins/debugger/breakwindow.h @@ -62,6 +62,7 @@ private: void deleteBreakpoints(const QModelIndexList &list); void deleteBreakpoints(QList<int> rows); void addBreakpoint(); + bool editBreakpoint(BreakpointData *data); // Returns 'Accept'. void editBreakpoints(const QModelIndexList &list); void associateBreakpoint(const QModelIndexList &list, int thread); void setBreakpointsEnabled(const QModelIndexList &list, bool enabled); diff --git a/src/plugins/debugger/debuggerconstants.h b/src/plugins/debugger/debuggerconstants.h index 6f56ef5dbcc72c9f6e03cccf350d8c48d6a8b32d..35e60bcfe45fda385d7e08b7e46c1fe3a9922800 100644 --- a/src/plugins/debugger/debuggerconstants.h +++ b/src/plugins/debugger/debuggerconstants.h @@ -204,6 +204,7 @@ enum ModelRoles RequestExecuteCommandRole, // Breakpoints + BreakpointRole, BreakpointEnabledRole, BreakpointUseFullPathRole, BreakpointFunctionNameRole,