aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorhjk <[email protected]>2010-03-12 11:14:50 +0100
committerhjk <[email protected]>2010-03-15 12:12:43 +0100
commit463ac5d6892d83ec0cc8ecb20cf439953f68fc21 (patch)
tree2ef3ab9d6c09fa8653c623ed216f978fe3c9b006 /src
parentbb35660c40f576274d28df516c346ba2f2fc6af8 (diff)
debugger: start reviving graphical data display
Diffstat (limited to 'src')
-rw-r--r--src/plugins/debugger/gdb/gdbengine.cpp13
-rw-r--r--src/plugins/debugger/gdb/gdbengine.h3
-rw-r--r--src/plugins/debugger/watchhandler.cpp105
-rw-r--r--src/plugins/debugger/watchhandler.h36
-rw-r--r--src/plugins/debugger/watchutils.cpp2
5 files changed, 53 insertions, 106 deletions
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index 50817196b3b..6fca40e49a0 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -3293,8 +3293,6 @@ void GdbEngine::sendWatchParameters(const QByteArray &params0)
void GdbEngine::handleVarAssign(const GdbResponse &)
{
// Everything might have changed, force re-evaluation.
- // FIXME: Speed this up by re-using variables and only
- // marking values as 'unknown'
setTokenBarrier();
updateLocals();
}
@@ -3370,13 +3368,6 @@ void GdbEngine::handleChildren(const WatchData &data0, const GdbMi &item,
if (children.isValid() || !manager()->watchHandler()->isExpandedIName(data.iname))
data.setChildrenUnneeded();
- if (manager()->watchHandler()->isDisplayedIName(data.iname)) {
- GdbMi editvalue = item.findChild("editvalue");
- if (editvalue.isValid()) {
- setWatchDataEditValue(data, editvalue);
- manager()->watchHandler()->showEditValue(data);
- }
- }
setWatchDataType(data, item.findChild("type"));
setWatchDataEditValue(data, item.findChild("editvalue"));
setWatchDataValue(data, item.findChild("value"),
@@ -4204,13 +4195,13 @@ void GdbEngine::handleAdapterCrashed(const QString &msg)
showMessageBox(QMessageBox::Critical, tr("Adapter crashed"), msg);
}
-void GdbEngine::addOptionPages(QList<Core::IOptionsPage*> *opts) const
+void GdbEngine::addOptionPages(QList<Core::IOptionsPage *> *opts) const
{
opts->push_back(new GdbOptionsPage);
opts->push_back(new TrkOptionsPage(m_trkOptions));
}
-QMessageBox * GdbEngine::showMessageBox(int icon, const QString &title,
+QMessageBox *GdbEngine::showMessageBox(int icon, const QString &title,
const QString &text, int buttons)
{
return m_manager->showMessageBox(icon, title, text, buttons);
diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h
index 2edfb2e45e0..333e272207b 100644
--- a/src/plugins/debugger/gdb/gdbengine.h
+++ b/src/plugins/debugger/gdb/gdbengine.h
@@ -47,12 +47,9 @@
#include <QtCore/QVariant>
QT_BEGIN_NAMESPACE
-class QAbstractItemModel;
-class QAction;
class QMainWindow;
class QMessageBox;
class QTimer;
-class QWidget;
QT_END_NAMESPACE
namespace Debugger {
diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp
index c02d379726e..54ba571eb66 100644
--- a/src/plugins/debugger/watchhandler.cpp
+++ b/src/plugins/debugger/watchhandler.cpp
@@ -259,7 +259,8 @@ QString WatchData::toString() const
str << "value=\"" << value << doubleQuoteComma;
if (!editvalue.isEmpty())
- str << "editvalue=\"" << editvalue << doubleQuoteComma;
+ str << "editvalue=\"<...>\",";
+ // str << "editvalue=\"" << editvalue << doubleQuoteComma;
if (isTypeNeeded())
str << "type=<needed>,";
@@ -281,8 +282,9 @@ QString WatchData::toString() const
return res + QLatin1Char('}');
}
-// Format a tooltip fow with aligned colon
-static void formatToolTipRow(QTextStream &str, const QString &category, const QString &value)
+// Format a tooltip fow with aligned colon.
+static void formatToolTipRow(QTextStream &str,
+ const QString &category, const QString &value)
{
str << "<tr><td>" << category << "</td><td> : </td><td>"
<< Qt::escape(value) << "</td></tr>";
@@ -815,10 +817,6 @@ QVariant WatchModel::data(const QModelIndex &idx, int role) const
case ExpandedRole:
return m_handler->m_expandedINames.contains(data.iname);
- case ActiveDataRole:
- qDebug() << "ASK FOR" << data.iname;
- return true;
-
case TypeFormatListRole:
if (isIntType(data.type))
return QStringList() << tr("decimal") << tr("hexadecimal")
@@ -830,6 +828,10 @@ QVariant WatchModel::data(const QModelIndex &idx, int role) const
<< tr("UTF8 string")
<< tr("UTF16 string")
<< tr("UCS4 string");
+ if (data.type.endsWith(QLatin1String("QImage")))
+ return QStringList()
+ << tr("normal")
+ << tr("displayed");
break;
case TypeFormatRole:
@@ -1202,13 +1204,12 @@ void WatchHandler::endCycle()
void WatchHandler::cleanup()
{
m_expandedINames.clear();
- m_displayedINames.clear();
m_locals->reinitialize();
m_tooltips->reinitialize();
m_locals->m_fetchTriggered.clear();
m_watchers->m_fetchTriggered.clear();
m_tooltips->m_fetchTriggered.clear();
-#if 0
+#if 1
for (EditWindows::ConstIterator it = m_editWindows.begin();
it != m_editWindows.end(); ++it) {
if (!it.value().isNull())
@@ -1233,6 +1234,7 @@ void WatchHandler::insertData(const WatchData &data)
__FILE__, __LINE__, qPrintable(data.toString()));
return;
}
+
if (data.isSomethingNeeded() && data.iname.contains('.')) {
MODEL_DEBUG("SOMETHING NEEDED: " << data.toString());
IDebuggerEngine *engine = m_manager->currentEngine();
@@ -1253,6 +1255,9 @@ void WatchHandler::insertData(const WatchData &data)
QTC_ASSERT(model, return);
MODEL_DEBUG("NOTHING NEEDED: " << data.toString());
model->insertData(data);
+
+ if (!data.editvalue.isEmpty())
+ showEditValue(data);
}
}
@@ -1331,79 +1336,57 @@ void WatchHandler::watchExpression(const QString &exp)
saveWatchers();
}
-void WatchHandler::setDisplayedIName(const QString &iname, bool on)
+static void swapEndian(char *d, int nchar)
{
- Q_UNUSED(iname)
- Q_UNUSED(on)
-/*
- WatchData *d = findData(iname);
- if (!on || !d) {
- delete m_editWindows.take(iname);
- m_displayedINames.remove(iname);
- return;
- }
- if (d->exp.isEmpty()) {
- //emit statusMessageRequested(tr("Sorry. Cannot visualize objects without known address."), 5000);
- return;
+ QTC_ASSERT(nchar % 4 == 0, return);
+ for (int i = 0; i < nchar; i += 4) {
+ char c = d[i];
+ d[i] = d[i + 3];
+ d[i + 3] = c;
+ c = d[i + 1];
+ d[i + 1] = d[i + 2];
+ d[i + 2] = c;
}
- d->setValueNeeded();
- m_displayedINames.insert(iname);
- insertData(*d);
-*/
}
void WatchHandler::showEditValue(const WatchData &data)
{
- // editvalue is always base64 encoded
- QByteArray ba = QByteArray::fromBase64(data.editvalue);
- //QByteArray ba = data.editvalue;
+ // Editvalue is always hex encoded.
+ QByteArray ba = QByteArray::fromHex(data.editvalue);
QWidget *w = m_editWindows.value(data.iname);
- qDebug() << "SHOW_EDIT_VALUE " << data.toString() << data.type
- << data.iname << w;
- if (data.type == QLatin1String("QImage")) {
+ const int format = ba.at(0);
+ if (format == 0x1) {
+ // QImage
if (!w) {
w = new QLabel;
m_editWindows[data.iname] = w;
}
- QDataStream ds(&ba, QIODevice::ReadOnly);
- QVariant v;
- ds >> v;
- QString type = QString::fromAscii(v.typeName());
- QImage im = v.value<QImage>();
- if (QLabel *l = qobject_cast<QLabel *>(w))
+ if (QLabel *l = qobject_cast<QLabel *>(w)) {
+ char *d = ba.data() + 1;
+ swapEndian(d, ba.size() - 1);
+ const int *header = (int *)(d);
+ const uchar *data = 12 + (uchar *)(d);
+ QImage im(data, header[0], header[1], QImage::Format(header[2]));
l->setPixmap(QPixmap::fromImage(im));
- } else if (data.type == QLatin1String("QPixmap")) {
- if (!w) {
- w = new QLabel;
- m_editWindows[data.iname] = w;
+ l->resize(header[0], header[1]);
+ l->show();
}
- QDataStream ds(&ba, QIODevice::ReadOnly);
- QVariant v;
- ds >> v;
- QString type = QString::fromAscii(v.typeName());
- QPixmap im = v.value<QPixmap>();
- if (QLabel *l = qobject_cast<QLabel *>(w))
- l->setPixmap(im);
- } else if (data.type == QLatin1String("QString")) {
+ } else if (format == 0x2) {
+ // QString
if (!w) {
w = new QTextEdit;
m_editWindows[data.iname] = w;
}
-#if 0
- QDataStream ds(&ba, QIODevice::ReadOnly);
- QVariant v;
- ds >> v;
- QString type = QString::fromAscii(v.typeName());
- QString str = v.value<QString>();
-#else
MODEL_DEBUG("DATA: " << ba);
QString str = QString::fromUtf16((ushort *)ba.constData(), ba.size()/2);
-#endif
- if (QTextEdit *t = qobject_cast<QTextEdit *>(w))
+ if (QTextEdit *t = qobject_cast<QTextEdit *>(w)) {
t->setText(str);
+ t->resize(400, 200);
+ t->show();
+ }
+ } else {
+ QTC_ASSERT(false, qDebug() << "Display format: " << format);
}
- if (w)
- w->show();
}
void WatchHandler::removeWatchExpression()
diff --git a/src/plugins/debugger/watchhandler.h b/src/plugins/debugger/watchhandler.h
index 365426b850c..055387d7afd 100644
--- a/src/plugins/debugger/watchhandler.h
+++ b/src/plugins/debugger/watchhandler.h
@@ -140,7 +140,7 @@ public:
bool error;
public:
- int source; // Used by some debuggers (CDB) to tell where it originates from (dumper or symbol evaluation)
+ int source; // Originated from dumper or symbol evaluation? (CDB only)
int state;
bool changed;
};
@@ -149,40 +149,21 @@ enum WatchRoles
{
INameRole = Qt::UserRole,
ExpressionRole,
- ExpandedRole, // used to communicate preferred expanded state to the view
- ActiveDataRole, // used for tooltip
+ ExpandedRole, // Used to communicate preferred expanded state to the view.
TypeFormatListRole,
- TypeFormatRole, // used to communicate alternative formats to the view
+ TypeFormatRole, // Used to communicate alternative formats to the view.
IndividualFormatRole,
- AddressRole, // some memory address related to the object
+ AddressRole, // Some memory address related to the object.
};
enum IntegerFormat
{
- DecimalFormat = 0, // keep that at 0 as default
+ DecimalFormat = 0, // Keep that at 0 as default.
HexadecimalFormat,
BinaryFormat,
OctalFormat,
};
-
-enum PointerFomat
-{
- BaldPointerFormat = 0, // keep that at 0 as default
- Latin1StringFormat,
- Local8BitStringFormat,
- Utf8StringFormat,
- Utf16StringFormat,
- Ucs4StringFormat,
-};
-
-
-enum DumpableFormat
-{
- PrettyFormat = 0, // keep that at 0 as default
- PlainFomat,
-};
-
class WatchModel : public QAbstractItemModel
{
Q_OBJECT
@@ -274,8 +255,6 @@ public:
void loadSessionData();
void saveSessionData();
- bool isDisplayedIName(const QByteArray &iname) const
- { return m_displayedINames.contains(iname); }
bool isExpandedIName(const QByteArray &iname) const
{ return m_expandedINames.contains(iname); }
QSet<QByteArray> expandedINames() const
@@ -308,10 +287,7 @@ private:
QByteArray watcherName(const QByteArray &exp);
QHash<QString, int> m_typeFormats;
QHash<QString, int> m_individualFormats;
-
- void setDisplayedIName(const QString &iname, bool on);
- QSet<QByteArray> m_expandedINames; // those expanded in the treeview
- QSet<QByteArray> m_displayedINames; // those with "external" viewers
+ QSet<QByteArray> m_expandedINames; // Those expanded in the treeview.
WatchModel *m_locals;
WatchModel *m_watchers;
diff --git a/src/plugins/debugger/watchutils.cpp b/src/plugins/debugger/watchutils.cpp
index bda7f9d373b..0e3e7f81387 100644
--- a/src/plugins/debugger/watchutils.cpp
+++ b/src/plugins/debugger/watchutils.cpp
@@ -681,7 +681,7 @@ QString decodeData(const QByteArray &ba, int encoding)
return doubleQuote + QString::fromUcs4(reinterpret_cast<const uint *>
(decodedBa.data()), decodedBa.size() / 4) + doubleQuote;
}
- case 11: { // %02x encoded 16 bit data, Big Endian
+ case 11: { // %04x encoded 16 bit data, Big Endian
const QChar doubleQuote(QLatin1Char('"'));
QByteArray decodedBa = QByteArray::fromHex(ba);
for (int i = 0; i < decodedBa.size(); i += 2) {