Hexes/hexviewer.h

158 lines
4.2 KiB
C
Raw Permalink Normal View History

2024-10-28 19:15:27 -04:00
#ifndef HEXVIEWER_H
#define HEXVIEWER_H
#include "rule.h"
#include "blockvalue.h"
2024-11-02 19:19:53 -04:00
#include "hexstream.h"
#include "hexeslogger.h"
2024-10-28 19:15:27 -04:00
#include <QAbstractScrollArea>
#include <QPainter>
#include <QScrollBar>
#include <QPaintEvent>
#include <QResizeEvent>
#include <QTimer>
#include <QQueue>
#include <QFile>
#include <QFileDialog>
#include <QSettings>
#include <QMetaType>
2024-11-02 19:19:53 -04:00
const int DEFAULT_SINGLE_STEP = 45;
const int DEFAULT_PAGE_STEP = 45;
const int OFFSET_HEADER_WIDTH = 80;
const int MIN_PADDING = 5;
const int MAX_PADDING = 15;
const int HEADER_HEIGHT = 15;
const int STATUS_BAR_HEIGHT = 35;
const int FONT_HEIGHT = 15;
2024-10-28 19:15:27 -04:00
class HexViewer : public QAbstractScrollArea
{
Q_OBJECT
public:
explicit HexViewer(QWidget *parent = nullptr);
~HexViewer();
void SetFileName(const QString fileName);
QStringList RuleNames();
2024-11-02 19:19:53 -04:00
void ParseRules();
2024-10-28 19:15:27 -04:00
void DeclareVar();
void SetVar(QString varName, QVariant value);
QVariant GetVar(QString varName);
QMap<QString, BlockValue> GetVars();
2024-11-02 19:19:53 -04:00
void SetBaseDir(QString dir);
2024-10-28 19:15:27 -04:00
QString Text();
QString Hex();
2024-11-02 19:19:53 -04:00
QString pFormatValuesGrid(const QVector<int>& values, int width, const QFont& font, int bitSize, int &textHeight);
2024-10-28 19:15:27 -04:00
public slots:
void AddRule(const Rule rule);
void AddRules(const QVector<Rule> rules);
void DeleteRule(const Rule rule);
void DeleteRuleByName(const QString ruleName);
void PopRule();
void ClearRules();
void SaveRules();
void OpenRules();
2024-11-02 19:19:53 -04:00
void OpenFile();
2024-10-28 19:15:27 -04:00
protected:
void resizeEvent(QResizeEvent *event) override;
void keyPressEvent(QKeyEvent *event) override;
void mousePressEvent(QMouseEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override;
void paintEvent(QPaintEvent *event) override;
void showEvent(QShowEvent *event) override;
QSize sizeHint() const override;
2024-11-02 19:19:53 -04:00
private slots:
void pScrollValueChanged(int value);
void pBlinkCursor();
2024-10-28 19:15:27 -04:00
signals:
void RuleNamesChanged(QStringList ruleNames);
void VarsChanged(QMap<QString, BlockValue> vars);
2024-11-02 19:19:53 -04:00
void FileOpened(const QString aFileName);
void BaseDirChanged(QString dir);
2024-10-28 19:15:27 -04:00
private:
QString pFileName;
QString pHex;
QString pText;
QRectF pViewRect;
QFile pFile;
QMap<QString, BlockValue> pVars;
2024-11-02 19:19:53 -04:00
QFontMetrics pFontMetrics;
QString pFileDir;
2024-10-28 19:15:27 -04:00
int pScrollValue;
int pCursorPosition; // Cursor position in the text
bool pCursorVisible; // Flag for cursor blinking
int pSelectionStart; // Selection start index
int pSelectionEnd; // Selection end index
QTimer *pBlinkTimer; // Timer for blinking cursor
QQueue<Rule> pRules;
2024-11-02 19:19:53 -04:00
// Init, update, & utility functions
void pInitCursorTimer();
void pInitScrollBar();
void pUpdateScrollBar();
2024-10-28 19:15:27 -04:00
QString pCleanHex(const QString &text);
QString pStringToHex(const QString &text);
2024-11-02 19:19:53 -04:00
void pSeekFile();
void pRefreshRules();
2024-10-28 19:15:27 -04:00
2024-11-02 19:19:53 -04:00
// Cursor functions
2024-10-28 19:15:27 -04:00
void pPaintCursor(QPainter &painter);
2024-11-02 19:19:53 -04:00
int pCalcCursorLine() const;
QPoint pCalcCursorPosition() const;
// Selection functions
2024-10-28 19:15:27 -04:00
void pPaintSelection(QPainter &painter);
2024-11-02 19:19:53 -04:00
// Header functions
2024-10-28 19:15:27 -04:00
void pPaintHeaders(QPainter &painter);
2024-11-02 19:19:53 -04:00
QRectF pCalcHexHeaderRect() const;
QRectF pCalcOffsetHeaderRect() const;
QRectF pCalcRuleHeaderRect() const;
QRectF pCalcTextHeaderRect() const;
// Hex content functions
2024-10-28 19:15:27 -04:00
void pPaintHex(QPainter &painter);
2024-11-02 19:19:53 -04:00
QRectF pCalcHexRect() const;
// Text content functions
2024-10-28 19:15:27 -04:00
void pPaintText(QPainter &painter);
2024-11-02 19:19:53 -04:00
QRectF pCalcTextRect() const;
// Offset functions
2024-10-28 19:15:27 -04:00
void pPaintOffsetColumn(QPainter &painter);
2024-11-02 19:19:53 -04:00
QRectF pCalcOffsetColumnRect() const;
// Rule functions
2024-10-28 19:15:27 -04:00
void pPaintRules(QPainter &painter);
2024-11-02 19:19:53 -04:00
QRectF pCalcRuleRect() const;
2024-10-28 19:15:27 -04:00
void pPaintHexRule(QPainter &painter, int &currentXPos,
int &currentYPos, int ruleLen, bool skip = false);
void pPaintTextRule(QPainter &painter, int &currentXPos,
int &currentYPos, int ruleLen, bool skip = false);
2024-11-02 19:19:53 -04:00
// Other calculations
QRectF pCalcPaintRect() const;
2024-10-28 19:15:27 -04:00
int pCalcContentHeight() const;
int pCalcCharCount() const;
int pCalcLineCount() const;
};
#endif // HEXVIEWER_H