File indexing completed on 2024-04-21 05:53:10
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& Xs, Line firstLineIndex) 0049 { 0050 Q_UNUSED(Xs); 0051 0052 mRenderLineIndex = firstLineIndex; 0053 renderLine(painter, mRenderLineIndex++); 0054 } 0055 0056 void OffsetColumnRendererPrivate::renderNextLine(QPainter* painter) 0057 { 0058 renderLine(painter, mRenderLineIndex++); 0059 } 0060 0061 void OffsetColumnRendererPrivate::renderColumn(QPainter* painter, const PixelXRange& Xs, const PixelYRange& Ys) 0062 { 0063 renderColumnBackground(painter, Xs, Ys); 0064 } 0065 0066 void OffsetColumnRendererPrivate::renderEmptyColumn(QPainter* painter, const PixelXRange& Xs, const PixelYRange& Ys) 0067 { 0068 renderColumnBackground(painter, Xs, Ys); 0069 } 0070 0071 void OffsetColumnRendererPrivate::setFormat(OffsetFormat::Format format, const QFontMetrics& fontMetrics) 0072 { 0073 // no changes? 0074 if (mFormat == format) { 0075 return; 0076 } 0077 0078 mFormat = format; 0079 0080 PrintFunction = OffsetFormat::printFunction(mFormat); 0081 0082 setFontMetrics(fontMetrics); 0083 } 0084 0085 void OffsetColumnRendererPrivate::setFontMetrics(const QFontMetrics& fontMetrics) 0086 { 0087 mDigitBaseLine = fontMetrics.ascent(); 0088 0089 // use 0 as reference, using a fixed font should always yield same width 0090 PrintFunction(mCodedOffset, 0); 0091 const int newOffsetTextWidth = fontMetrics.horizontalAdvance(QLatin1String(mCodedOffset)); 0092 0093 if (newOffsetTextWidth == mOffsetTextWidth) { 0094 return; 0095 } 0096 0097 mOffsetTextWidth = newOffsetTextWidth; 0098 0099 recalcX(); 0100 } 0101 0102 void OffsetColumnRendererPrivate::recalcX() 0103 { 0104 Q_Q(OffsetColumnRenderer); 0105 0106 // recalculate depend sizes 0107 q->setWidth(mOffsetTextWidth + leftOffsetMargin + rightOffsetMargin); 0108 } 0109 0110 }