diff options
author | con <qtc-committer@nokia.com> | 2010-07-06 15:34:50 +0200 |
---|---|---|
committer | con <qtc-committer@nokia.com> | 2010-07-06 15:34:50 +0200 |
commit | 1a2a4f6387e890d6564eac5644bb26bfe6985d2c (patch) | |
tree | 1bbbc92c4f458ca878489d2e84cbc6fa8839b504 /src/plugins/bineditor | |
parent | 7feed7318b3ca52d56cb6eb8f11233f32bdcae09 (diff) | |
parent | 15047f8816716af0794da4164daa3e007175a78a (diff) | |
download | qt-creator-1a2a4f6387e890d6564eac5644bb26bfe6985d2c.tar.gz |
Merge remote branch 'origin/2.0'
Conflicts:
share/qtcreator/gdbmacros/dumper.py
src/libs/qmljs/qmljs-lib.pri
src/plugins/fakevim/fakevimhandler.cpp
Diffstat (limited to 'src/plugins/bineditor')
-rw-r--r-- | src/plugins/bineditor/bineditor.cpp | 86 | ||||
-rw-r--r-- | src/plugins/bineditor/bineditor.h | 3 |
2 files changed, 82 insertions, 7 deletions
diff --git a/src/plugins/bineditor/bineditor.cpp b/src/plugins/bineditor/bineditor.cpp index 3e98ee0ad4..0a6dbcfbb2 100644 --- a/src/plugins/bineditor/bineditor.cpp +++ b/src/plugins/bineditor/bineditor.cpp @@ -40,10 +40,12 @@ #include <QtGui/QAction> #include <QtGui/QClipboard> #include <QtGui/QFontMetrics> +#include <QtGui/QHelpEvent> #include <QtGui/QMenu> #include <QtGui/QMessageBox> #include <QtGui/QPainter> #include <QtGui/QScrollBar> +#include <QtGui/QToolTip> #include <QtGui/QWheelEvent> using namespace BINEditor; @@ -1030,7 +1032,64 @@ bool BinEditor::event(QEvent *e) { break; default:; } + } else if (e->type() == QEvent::ToolTip) { + bool hide = true; + int selStart = selectionStart(); + int selEnd = selectionEnd(); + int byteCount = selEnd - selStart; + if (byteCount <= 0) { + selStart = m_cursorPosition; + selEnd = selStart + 1; + byteCount = 1; + } + if (byteCount <= 8) { + const QPoint &startPoint = offsetToPos(selStart); + const QPoint &endPoint = offsetToPos(selEnd); + const QPoint expandedEndPoint + = QPoint(endPoint.x(), endPoint.y() + m_lineHeight); + const QRect selRect(startPoint, expandedEndPoint); + const QHelpEvent * const helpEvent = static_cast<QHelpEvent *>(e); + const QPoint &mousePos = helpEvent->pos(); + if (selRect.contains(mousePos)) { + quint64 beValue, leValue; + asIntegers(selStart, byteCount, beValue, leValue); + QString leSigned; + QString beSigned; + switch (byteCount) { + case 8: case 7: case 6: case 5: + leSigned = QString::number(static_cast<qint64>(leValue)); + beSigned = QString::number(static_cast<qint64>(beValue)); + break; + case 4: case 3: + leSigned = QString::number(static_cast<qint32>(leValue)); + beSigned = QString::number(static_cast<qint32>(beValue)); + break; + case 2: + leSigned = QString::number(static_cast<qint16>(leValue)); + beSigned = QString::number(static_cast<qint16>(beValue)); + break; + case 1: + leSigned = QString::number(static_cast<qint8>(leValue)); + beSigned = QString::number(static_cast<qint8>(beValue)); + break; + } + hide = false; + QToolTip::showText(helpEvent->globalPos(), + tr("Decimal unsigned value (little endian): %1\n" + "Decimal unsigned value (big endian): %2\n" + "Decimal signed value (little endian): %3\n" + "Decimal signed value (big endian): %4") + .arg(QString::number(leValue)) + .arg(QString::number(beValue)) + .arg(leSigned).arg(beSigned)); + } + } + if (hide) + QToolTip::hideText(); + e->accept(); + return true; } + return QAbstractScrollArea::event(e); } @@ -1271,13 +1330,7 @@ void BinEditor::contextMenuEvent(QContextMenuEvent *event) quint64 beAddress = 0; quint64 leAddress = 0; if (byteCount <= 8) { - const QByteArray &data = dataMid(selStart, byteCount); - for (int pos = 0; pos < byteCount; ++pos) { - const quint64 val = static_cast<quint64>(data.at(pos)) & 0xff; - beAddress += val << (pos * 8); - leAddress += val << ((byteCount - pos - 1) * 8); - } - + asIntegers(selStart, byteCount, beAddress, leAddress); setupJumpToMenuAction(&contextMenu, &jumpToBeAddressHere, &jumpToBeAddressNewWindow, beAddress); @@ -1335,3 +1388,22 @@ void BinEditor::setNewWindowRequestAllowed() { m_canRequestNewWindow = true; } + +QPoint BinEditor::offsetToPos(int offset) +{ + const int x = m_labelWidth + (offset % 16) * m_columnWidth; + const int y = (offset / 16) * m_lineHeight; + return QPoint(x, y); +} + +void BinEditor::asIntegers(int offset, int count, quint64 &beValue, + quint64 &leValue) +{ + beValue = leValue = 0; + const QByteArray &data = dataMid(offset, count); + for (int pos = 0; pos < count; ++pos) { + const quint64 val = static_cast<quint64>(data.at(pos)) & 0xff; + beValue += val << (pos * 8); + leValue += val << ((count - pos - 1) * 8); + } +} diff --git a/src/plugins/bineditor/bineditor.h b/src/plugins/bineditor/bineditor.h index 8dfc695be1..cea7b8d168 100644 --- a/src/plugins/bineditor/bineditor.h +++ b/src/plugins/bineditor/bineditor.h @@ -169,6 +169,9 @@ private: QByteArray dataMid(int from, int length) const; QByteArray blockData(int block) const; + QPoint offsetToPos(int offset); + void asIntegers(int offset, int count, quint64 &beValue, quint64 &leValue); + int m_unmodifiedState; int m_readOnly; int m_margin; |