OSDN Git Service

Debugger[CDB]: Show expandable tooltips.
authorFriedemann Kleint <Friedemann.Kleint@nokia.com>
Tue, 25 Jan 2011 12:59:25 +0000 (13:59 +0100)
committerFriedemann Kleint <Friedemann.Kleint@nokia.com>
Tue, 25 Jan 2011 12:59:25 +0000 (13:59 +0100)
By setting a filter model on the locals model.
Prepare infrastructure for filter models for pinneable
tooltips in debuggertooltips.

src/plugins/debugger/cdb/cdbengine.cpp
src/plugins/debugger/debuggertooltip.cpp
src/plugins/debugger/debuggertooltip.h

index 1e5fe35..efe58d0 100644 (file)
@@ -440,9 +440,11 @@ void CdbEngine::setToolTipExpression(const QPoint &mousePos, TextEditor::ITextEd
     if (!(exp.at(0).isLetter() || exp.at(0) == QLatin1Char('_')))
         return;
     const QByteArray iname = QByteArray(localsPrefixC) + exp.toAscii();
-    if (const WatchData *data = watchHandler()->findItem(iname)) {
-        QToolTip::hideText();
-        QToolTip::showText(mousePos, data->toToolTip());
+    const QModelIndex index = watchHandler()->itemIndex(iname);
+    if (index.isValid()) {
+        showDebuggerToolTip(mousePos, watchHandler()->modelForIName(iname), index.row());
+    } else {
+        hideDebuggerToolTip();
     }
 }
 
index caead02..ab65d8b 100644 (file)
@@ -33,6 +33,8 @@
 
 #include "debuggertooltip.h"
 
+#include <utils/qtcassert.h>
+
 #include <QtCore/QtDebug>
 #include <QtCore/QPointer>
 
@@ -42,6 +44,7 @@
 #include <QtGui/QKeyEvent>
 #include <QtGui/QScrollBar>
 #include <QtGui/QTreeView>
+#include <QtGui/QSortFilterProxyModel>
 
 namespace Debugger {
 namespace Internal {
@@ -177,6 +180,9 @@ void ToolTipWidget::run(const QPoint &point, const QModelIndex &index)
     QAbstractItemModel *model = const_cast<QAbstractItemModel *>(index.model());
     move(point);
     setModel(model);
+    // Track changes in filter models.
+    connect(model, SIGNAL(rowsInserted(QModelIndex,int,int)),
+            this, SLOT(computeSize()), Qt::QueuedConnection);
     computeSize();
     setRootIsDecorated(model->hasChildren(index));
 }
@@ -201,6 +207,40 @@ void showDebuggerToolTip(const QPoint &point, const QModelIndex &index)
     }
 }
 
+// Model for tooltips filtering a local variable using the locals model.
+class ToolTipRowFilterModel : public QSortFilterProxyModel
+{
+public:
+    // Index points the variable to be filtered.
+    explicit ToolTipRowFilterModel(QAbstractItemModel *model, int row, QObject *parent = 0);
+    virtual bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const;
+
+private:
+    const int m_row;
+};
+
+ToolTipRowFilterModel::ToolTipRowFilterModel(QAbstractItemModel *model, int row, QObject *parent) :
+    QSortFilterProxyModel(parent), m_row(row)
+{
+    setSourceModel(model);
+}
+
+bool ToolTipRowFilterModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const
+{
+    // Match on row for top level, else pass through.
+    return sourceParent.isValid() || sourceRow == m_row;
+}
+
+// Show tooltip filtering a row of a source model.
+void showDebuggerToolTip(const QPoint &point, QAbstractItemModel *model, int row)
+{
+    // Create a filter model parented on the widget to display column
+    ToolTipRowFilterModel *filterModel = new ToolTipRowFilterModel(model, row);
+    showDebuggerToolTip(point, filterModel->index(0, 0));
+    QTC_ASSERT(theToolTipWidget, return; )
+    filterModel->setParent(theToolTipWidget);
+}
+
 void hideDebuggerToolTip(int delay)
 {
     Q_UNUSED(delay)
index 2b4f63e..9e7fec0 100644 (file)
 QT_BEGIN_NAMESPACE
 class QModelIndex;
 class QPoint;
+class QAbstractItemModel;
 QT_END_NAMESPACE
 
 namespace Debugger {
 namespace Internal {
 
 void showDebuggerToolTip(const QPoint &point, const QModelIndex &rootIndex);
+// Show tooltip filtering a row of a source model.
+void showDebuggerToolTip(const QPoint &point, QAbstractItemModel *model, int row);
 void hideDebuggerToolTip(int delay = 0);
 
 } // namespace Internal