diff options
Diffstat (limited to 'src/plugins/debugger/watchhandler.cpp')
-rw-r--r-- | src/plugins/debugger/watchhandler.cpp | 98 |
1 files changed, 55 insertions, 43 deletions
diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp index 0ad2e6f7d8..594add236c 100644 --- a/src/plugins/debugger/watchhandler.cpp +++ b/src/plugins/debugger/watchhandler.cpp @@ -301,8 +301,9 @@ public: return 0; } - template <class T> T *prepareObject(const QByteArray &key, const QString &tabName) + template <class T> T *prepareObject(const WatchItem *item) { + const QByteArray key = item->key(); T *t = 0; if (QWidget *w = findWidget(key)) { t = qobject_cast<T *>(w); @@ -312,8 +313,9 @@ public: if (!t) { t = new T; t->setProperty(KeyProperty, key); - addTab(t, tabName); + addTab(t, item->name); } + setProperty(INameProperty, item->iname); setCurrentWidget(t); show(); @@ -1498,17 +1500,16 @@ static void swapEndian(char *d, int nchar) void WatchModel::showEditValue(const WatchItem *item) { - const QByteArray key = item->address ? item->hexAddress() : item->iname; - switch (item->editformat) { - case StopDisplay: - m_separatedView->removeObject(key); - break; - case DisplayImageData: - case DisplayImageFile: { // QImage - int width = 0, height = 0, nbytes = 0, format = 0; + const QByteArray &format = item->editformat; + if (format.isEmpty()) { + // Nothing + m_separatedView->removeObject(item->key()); + } else if (format == DisplayImageData || format == DisplayImageFile) { + // QImage + int width = 0, height = 0, nbytes = 0, imformat = 0; QByteArray ba; uchar *bits = 0; - if (item->editformat == DisplayImageData) { + if (format == DisplayImageData) { ba = QByteArray::fromHex(item->editvalue); QTC_ASSERT(ba.size() > 16, return); const int *header = (int *)(ba.data()); @@ -1518,11 +1519,11 @@ void WatchModel::showEditValue(const WatchItem *item) width = header[0]; height = header[1]; nbytes = header[2]; - format = header[3]; - } else if (item->editformat == DisplayImageFile) { + imformat = header[3]; + } else if (format == DisplayImageFile) { QTextStream ts(item->editvalue); QString fileName; - ts >> width >> height >> nbytes >> format >> fileName; + ts >> width >> height >> nbytes >> imformat >> fileName; QFile f(fileName); f.open(QIODevice::ReadOnly); ba = f.readAll(); @@ -1532,11 +1533,10 @@ void WatchModel::showEditValue(const WatchItem *item) QTC_ASSERT(0 < width && width < 10000, return); QTC_ASSERT(0 < height && height < 10000, return); QTC_ASSERT(0 < nbytes && nbytes < 10000 * 10000, return); - QTC_ASSERT(0 < format && format < 32, return); - QImage im(width, height, QImage::Format(format)); + QTC_ASSERT(0 < imformat && imformat < 32, return); + QImage im(width, height, QImage::Format(imformat)); std::memcpy(im.bits(), bits, nbytes); - ImageViewer *v = m_separatedView->prepareObject<ImageViewer>(key, item->name); - v->setProperty(INameProperty, item->iname); + ImageViewer *v = m_separatedView->prepareObject<ImageViewer>(item); v->setInfo(item->address ? tr("%1 Object at %2").arg(QLatin1String(item->type), QLatin1String(item->hexAddress())) : @@ -1546,35 +1546,29 @@ void WatchModel::showEditValue(const WatchItem *item) .arg(width).arg(height).arg(nbytes).arg(im.format()).arg(im.depth()) ); v->setImage(im); - break; - } - case DisplayUtf16String: - case DisplayLatin1String: - case DisplayUtf8String: { // String data. + } else if (format == DisplayLatin1String + || format == DisplayUtf8String + || format == DisplayUtf16String + || format == DisplayUcs4String) { + // String data. QByteArray ba = QByteArray::fromHex(item->editvalue); QString str; - if (item->editformat == DisplayUtf16String) - str = QString::fromUtf16((ushort *)ba.constData(), ba.size()/2); - else if (item->editformat == DisplayLatin1String) + if (format == DisplayLatin1String) str = QString::fromLatin1(ba.constData(), ba.size()); - else if (item->editformat == DisplayUtf8String) + else if (format == DisplayUtf8String) str = QString::fromUtf8(ba.constData(), ba.size()); - QTextEdit *t = m_separatedView->prepareObject<QTextEdit>(key, item->name); - t->setProperty(INameProperty, item->iname); - t->setText(str); - break; - } - case DisplayPlotData: { // Plots + else if (format == DisplayUtf16String) + str = QString::fromUtf16((ushort *)ba.constData(), ba.size() / 2); + else if (format == DisplayUtf16String) + str = QString::fromUcs4((uint *)ba.constData(), ba.size() / 4); + m_separatedView->prepareObject<QTextEdit>(item)->setText(str); + } else if (format == DisplayPlotData) { + // Plots std::vector<double> data; readNumericVector(&data, QByteArray::fromHex(item->editvalue), item->editencoding); - PlotViewer *v = m_separatedView->prepareObject<PlotViewer>(key, item->name); - v->setProperty(INameProperty, item->iname); - v->setData(data); - break; - } - default: - QTC_ASSERT(false, qDebug() << "Display format: " << item->editformat); - break; + m_separatedView->prepareObject<PlotViewer>(item)->setData(data); + } else { + QTC_ASSERT(false, qDebug() << "Display format: " << format); } } @@ -1714,6 +1708,24 @@ QString WatchHandler::nameForFormat(int format) return WatchModel::nameForFormat(format); } +static const char *formatStringFromFormatCode(int code) +{ + switch (code) { + // Taken from debuggerprotocol.h, DisplayFormat. + case Latin1StringFormat: + return "latin"; + case SeparateLatin1StringFormat: + return "latin:separate"; + case Utf8StringFormat: + return "utf8"; + case SeparateUtf8StringFormat: + return "utf8:separate"; + case Utf16StringFormat: + return "utf16"; + } + return ""; +} + QByteArray WatchHandler::typeFormatRequests() const { QByteArray ba; @@ -1725,7 +1737,7 @@ QByteArray WatchHandler::typeFormatRequests() const if (format != AutomaticFormat) { ba.append(it.key().toHex()); ba.append('='); - ba.append(QByteArray::number(format)); + ba.append(formatStringFromFormatCode(format)); ba.append(','); } } @@ -1745,7 +1757,7 @@ QByteArray WatchHandler::individualFormatRequests() const if (format != AutomaticFormat) { ba.append(it.key()); ba.append('='); - ba.append(QByteArray::number(it.value())); + ba.append(formatStringFromFormatCode(it.value())); ba.append(','); } } |