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 }