diff options
author | hjk <[email protected]> | 2010-03-12 11:14:50 +0100 |
---|---|---|
committer | hjk <[email protected]> | 2010-03-15 12:12:43 +0100 |
commit | 463ac5d6892d83ec0cc8ecb20cf439953f68fc21 (patch) | |
tree | 2ef3ab9d6c09fa8653c623ed216f978fe3c9b006 /src | |
parent | bb35660c40f576274d28df516c346ba2f2fc6af8 (diff) |
debugger: start reviving graphical data display
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/debugger/gdb/gdbengine.cpp | 13 | ||||
-rw-r--r-- | src/plugins/debugger/gdb/gdbengine.h | 3 | ||||
-rw-r--r-- | src/plugins/debugger/watchhandler.cpp | 105 | ||||
-rw-r--r-- | src/plugins/debugger/watchhandler.h | 36 | ||||
-rw-r--r-- | src/plugins/debugger/watchutils.cpp | 2 |
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 ¶ms0) 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) { |