1
Fork 0
mirror of https://github.com/redstrate/Novus.git synced 2025-05-02 08:07:45 +00:00
novus/parts/hex/document/qhexrenderer.h

83 lines
2.8 KiB
C
Raw Normal View History

2023-10-12 20:18:11 -04:00
// SPDX-FileCopyrightText: 2014 Dax89
// SPDX-License-Identifier: MIT
#ifndef QHEXRENDERER_H
#define QHEXRENDERER_H
/*
* Nibble encoding:
* AB -> [A][B]
* Nibble Index: 1 0
*/
#include "qhexdocument.h"
#include <QPainter>
#include <QTextDocument>
class QHexRenderer : public QObject
{
Q_OBJECT
public:
enum { HeaderArea, AddressArea, HexArea, AsciiArea, ExtraArea };
public:
explicit QHexRenderer(QHexDocument *document, const QFontMetricsF &fontmetrics, QObject *parent = nullptr);
void renderFrame(QPainter *painter);
void render(QPainter *painter, quint64 start, quint64 end, quint64 firstline); // begin included, end excluded
void updateMetrics(const QFontMetricsF &fm);
void enableCursor(bool b = true);
void selectArea(const QPoint &pt);
public:
void blinkCursor();
bool hitTest(const QPoint &pt, QHexPosition *position, quint64 firstline) const;
int hitTestArea(const QPoint &pt) const;
int selectedArea() const;
bool editableArea(int area) const;
quint64 documentLastLine() const;
int documentLastColumn() const;
quint64 documentLines() const;
int documentWidth() const;
int lineHeight() const;
QRect getLineRect(quint64 line, quint64 firstline) const;
int headerLineCount() const;
int borderSize() const;
int hexLineWidth() const;
private:
QString hexString(quint64 line, QByteArray *rawline = nullptr) const;
QString asciiString(quint64 line, QByteArray *rawline = nullptr) const;
QByteArray getLine(quint64 line) const;
qint64 rendererLength() const;
int getAddressWidth() const;
int getHexColumnX() const;
int getAsciiColumnX() const;
int getEndColumnX() const;
qreal getCellWidth() const;
int getNCellsWidth(int n) const;
void unprintableChars(QByteArray &ascii) const;
private:
enum Factor { Ascii = 1, Hex = 3 };
void applyDocumentStyles(QPainter *painter, QTextDocument *textdocument) const;
void applyBasicStyle(QTextCursor &textcursor, const QByteArray &rawline, Factor factor) const;
void applyMetadata(QTextCursor &textcursor, quint64 line, Factor factor) const;
void applySelection(QTextCursor &textcursor, quint64 line, Factor factor) const;
void applyCursorAscii(QTextCursor &textcursor, quint64 line) const;
void applyCursorHex(QTextCursor &textcursor, quint64 line) const;
void drawAddress(QPainter *painter, const QPalette &palette, const QRect &linerect, quint64 line);
void drawHex(QPainter *painter, const QPalette &palette, const QRect &linerect, quint64 line);
void drawAscii(QPainter *painter, const QPalette &palette, const QRect &linerect, quint64 line);
void drawHeader(QPainter *painter, const QPalette &palette);
private:
QHexDocument *m_document;
QFontMetricsF m_fontmetrics;
int m_selectedarea;
bool m_cursorenabled;
};
#endif // QHEXRENDERER_H