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 }