summaryrefslogtreecommitdiff
path: root/src/plugins/debugger/watchhandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/debugger/watchhandler.cpp')
-rw-r--r--src/plugins/debugger/watchhandler.cpp98
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(',');
}
}