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/plugins/debugger/watchhandler.cpp | |
parent | bb35660c40f576274d28df516c346ba2f2fc6af8 (diff) |
debugger: start reviving graphical data display
Diffstat (limited to 'src/plugins/debugger/watchhandler.cpp')
-rw-r--r-- | src/plugins/debugger/watchhandler.cpp | 105 |
1 files changed, 44 insertions, 61 deletions
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() |