File indexing completed on 2024-04-21 16:34:02
0001 /* 0002 This file is part of the Okteta Gui library, made within the KDE community. 0003 0004 SPDX-FileCopyrightText: 2003, 2008, 2019 Friedrich W. H. Kossebau <kossebau@kde.org> 0005 0006 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 0007 */ 0008 0009 #include "offsetcolumnrenderer_p.hpp" 0010 0011 // lib 0012 #include "bytearraytablelayout.hpp" 0013 // lib 0014 #include <abstractcolumnstylist.hpp> 0015 // Qt 0016 #include <QPainter> 0017 #include <QPalette> 0018 #include <QFontMetrics> 0019 0020 0021 namespace Okteta { 0022 0023 static constexpr PixelX leftOffsetMargin = 2; 0024 static constexpr PixelX rightOffsetMargin = 2; 0025 0026 0027 void OffsetColumnRendererPrivate::renderLine(QPainter* painter, Line lineIndex) 0028 { 0029 const PixelX offset = mLayout->firstLineOffset() + mLayout->noOfBytesPerLine() * lineIndex; 0030 PrintFunction(mCodedOffset, offset); 0031 0032 const QColor& buttonColor = mStylist->palette().buttonText().color(); 0033 painter->setPen(buttonColor); 0034 painter->drawText(leftOffsetMargin, mDigitBaseLine, QLatin1String(mCodedOffset)); 0035 } 0036 0037 void OffsetColumnRendererPrivate::renderColumnBackground(QPainter* painter, const PixelXRange& _Xs, const PixelYRange& Ys) 0038 { 0039 Q_Q(OffsetColumnRenderer); 0040 0041 PixelXRange Xs(_Xs); 0042 q->restrictToXSpan(&Xs); 0043 0044 const QBrush& buttonBrush = mStylist->palette().button(); 0045 painter->fillRect(Xs.start(), Ys.start(), Xs.width(), Ys.width(), buttonBrush); 0046 } 0047 0048 void OffsetColumnRendererPrivate::renderFirstLine(QPainter* painter, const PixelXRange&, Line firstLineIndex) 0049 { 0050 mRenderLineIndex = firstLineIndex; 0051 renderLine(painter, mRenderLineIndex++); 0052 } 0053 0054 void OffsetColumnRendererPrivate::renderNextLine(QPainter* painter) 0055 { 0056 renderLine(painter, mRenderLineIndex++); 0057 } 0058 0059 void OffsetColumnRendererPrivate::renderColumn(QPainter* painter, const PixelXRange& Xs, const PixelYRange& Ys) 0060 { 0061 renderColumnBackground(painter, Xs, Ys); 0062 } 0063 0064 void OffsetColumnRendererPrivate::renderEmptyColumn(QPainter* painter, const PixelXRange& Xs, const PixelYRange& Ys) 0065 { 0066 renderColumnBackground(painter, Xs, Ys); 0067 } 0068 0069 void OffsetColumnRendererPrivate::setFormat(OffsetFormat::Format format, const QFontMetrics& fontMetrics) 0070 { 0071 // no changes? 0072 if (mFormat == format) { 0073 return; 0074 } 0075 0076 mFormat = format; 0077 0078 PrintFunction = OffsetFormat::printFunction(mFormat); 0079 0080 setFontMetrics(fontMetrics); 0081 } 0082 0083 void OffsetColumnRendererPrivate::setFontMetrics(const QFontMetrics& fontMetrics) 0084 { 0085 mDigitBaseLine = fontMetrics.ascent(); 0086 0087 // use 0 as reference, using a fixed font should always yield same width 0088 PrintFunction(mCodedOffset, 0); 0089 #if (QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)) 0090 const int newOffsetTextWidth = fontMetrics.horizontalAdvance(QLatin1String(mCodedOffset)); 0091 #else 0092 const int newOffsetTextWidth = fontMetrics.width(QLatin1String(mCodedOffset)); 0093 #endif 0094 0095 if (newOffsetTextWidth == mOffsetTextWidth) { 0096 return; 0097 } 0098 0099 mOffsetTextWidth = newOffsetTextWidth; 0100 0101 recalcX(); 0102 } 0103 0104 void OffsetColumnRendererPrivate::recalcX() 0105 { 0106 Q_Q(OffsetColumnRenderer); 0107 0108 // recalculate depend sizes 0109 q->setWidth(mOffsetTextWidth + leftOffsetMargin + rightOffsetMargin); 0110 } 0111 0112 }