From 315a3ebdebc20b91fd509be4f3eca600f716c601 Mon Sep 17 00:00:00 2001
From: hjk <qthjk@ovi.com>
Date: Tue, 9 Oct 2012 22:34:36 +0200
Subject: [PATCH] Debugger: make breakpoint markers draggable

Change-Id: I6139badeb8cb8b20e653ce9f6685c0e577123617
Reviewed-by: David Schulz <david.schulz@digia.com>
---
 src/plugins/debugger/breakhandler.cpp     | 20 ++++++++++++++++++++
 src/plugins/debugger/breakhandler.h       |  2 ++
 src/plugins/debugger/breakpointmarker.cpp |  5 +++++
 src/plugins/debugger/breakpointmarker.h   |  2 ++
 4 files changed, 29 insertions(+)

diff --git a/src/plugins/debugger/breakhandler.cpp b/src/plugins/debugger/breakhandler.cpp
index 2c1327d02fd..f66e8031f18 100644
--- a/src/plugins/debugger/breakhandler.cpp
+++ b/src/plugins/debugger/breakhandler.cpp
@@ -37,6 +37,7 @@
 #include "debuggerstringutils.h"
 #include "stackframe.h"
 
+#include <extensionsystem/invoker.h>
 #include <utils/hostosinfo.h>
 #include <utils/qtcassert.h>
 
@@ -1258,6 +1259,25 @@ void BreakHandler::updateLineNumberFromMarker(BreakpointModelId id, int lineNumb
     emit layoutChanged();
 }
 
+void BreakHandler::changeLineNumberFromMarker(BreakpointModelId id, int lineNumber)
+{
+    // We need to delay this as it is called from a marker which will be destroyed.
+    ExtensionSystem::InvokerBase invoker;
+    invoker.addArgument(id);
+    invoker.addArgument(lineNumber);
+    invoker.setConnectionType(Qt::QueuedConnection);
+    invoker.invoke(this, "changeLineNumberFromMarkerHelper");
+    QTC_CHECK(invoker.wasSuccessful());
+}
+
+void BreakHandler::changeLineNumberFromMarkerHelper(BreakpointModelId id, int lineNumber)
+{
+    BreakpointParameters data = breakpointData(id);
+    data.lineNumber = lineNumber;
+    removeBreakpoint(id);
+    appendBreakpoint(data);
+}
+
 BreakpointModelIds BreakHandler::allBreakpointIds() const
 {
     BreakpointModelIds ids;
diff --git a/src/plugins/debugger/breakhandler.h b/src/plugins/debugger/breakhandler.h
index 750d2faff3c..7e6eb46a9bd 100644
--- a/src/plugins/debugger/breakhandler.h
+++ b/src/plugins/debugger/breakhandler.h
@@ -133,6 +133,7 @@ public:
     void setEnabled(BreakpointModelId id, bool on);
     void updateFileNameFromMarker(BreakpointModelId id, const QString &fileName);
     void updateLineNumberFromMarker(BreakpointModelId id, int lineNumber);
+    void changeLineNumberFromMarker(BreakpointModelId id, int lineNumber);
     void setMarkerFileAndLine(BreakpointModelId id,
         const QString &fileName, int lineNumber);
     bool isOneShot(BreakpointModelId id) const;
@@ -189,6 +190,7 @@ private:
     void loadBreakpoints();
     void saveBreakpoints();
     void cleanupBreakpoint(BreakpointModelId id);
+    Q_SLOT void changeLineNumberFromMarkerHelper(Debugger::Internal::BreakpointModelId id, int lineNumber);
 
     struct BreakpointItem
     {
diff --git a/src/plugins/debugger/breakpointmarker.cpp b/src/plugins/debugger/breakpointmarker.cpp
index 412bc5ade1f..0821ec1063f 100644
--- a/src/plugins/debugger/breakpointmarker.cpp
+++ b/src/plugins/debugger/breakpointmarker.cpp
@@ -68,6 +68,11 @@ void BreakpointMarker::updateLineNumber(int lineNumber)
     breakHandler()->updateLineNumberFromMarker(m_id, lineNumber);
 }
 
+void BreakpointMarker::dragToLine(int lineNumber)
+{
+    breakHandler()->changeLineNumberFromMarker(m_id, lineNumber);
+}
+
 void BreakpointMarker::updateFileName(const QString &fileName)
 {
     BaseTextMark::updateFileName(fileName);
diff --git a/src/plugins/debugger/breakpointmarker.h b/src/plugins/debugger/breakpointmarker.h
index 9f6f083828c..0a972d43756 100644
--- a/src/plugins/debugger/breakpointmarker.h
+++ b/src/plugins/debugger/breakpointmarker.h
@@ -46,6 +46,8 @@ public:
     void removedFromEditor();
     void updateLineNumber(int lineNumber);
     void updateFileName(const QString &fileName);
+    bool isDraggable() const { return true; }
+    void dragToLine(int lineNumber);
 
 private:
     BreakpointModelId m_id;
-- 
GitLab