1
Fork 0
mirror of https://github.com/redstrate/Novus.git synced 2025-05-01 15:57:45 +00:00
novus/parts/hex/document/qhexcursor.h

83 lines
2.2 KiB
C++

// SPDX-FileCopyrightText: 2014 Dax89
// SPDX-License-Identifier: MIT
#pragma once
#include <QObject>
#define DEFAULT_HEX_LINE_LENGTH 0x10
#define DEFAULT_AREA_IDENTATION 0x01
struct QHexPosition {
quint64 line;
int column;
quint8 lineWidth;
int nibbleindex;
QHexPosition() = default;
inline qint64 offset() const
{
return static_cast<qint64>(line * lineWidth) + column;
}
inline int operator-(const QHexPosition &rhs) const
{
return this->offset() - rhs.offset();
}
inline bool operator==(const QHexPosition &rhs) const
{
return (line == rhs.line) && (column == rhs.column) && (nibbleindex == rhs.nibbleindex);
}
inline bool operator!=(const QHexPosition &rhs) const
{
return (line != rhs.line) || (column != rhs.column) || (nibbleindex != rhs.nibbleindex);
}
};
class QHexCursor : public QObject
{
Q_OBJECT
public:
enum InsertionMode { OverwriteMode, InsertMode };
public:
explicit QHexCursor(QObject *parent = nullptr);
public:
const QHexPosition &selectionStart() const;
const QHexPosition &selectionEnd() const;
const QHexPosition &position() const;
InsertionMode insertionMode() const;
int selectionLength() const;
quint64 currentLine() const;
int currentColumn() const;
int currentNibble() const;
quint64 selectionLine() const;
int selectionColumn() const;
int selectionNibble() const;
bool atEnd() const;
bool isLineSelected(quint64 line) const;
bool hasSelection() const;
void clearSelection();
public:
void moveTo(const QHexPosition &pos);
void moveTo(quint64 line, int column, int nibbleindex = 1);
void moveTo(qint64 offset);
void select(const QHexPosition &pos);
void select(quint64 line, int column, int nibbleindex = 1);
void select(int length);
void selectOffset(qint64 offset, int length);
void setInsertionMode(InsertionMode mode);
void setLineWidth(quint8 width);
void switchInsertionMode();
Q_SIGNALS:
void positionChanged();
void insertionModeChanged();
private:
InsertionMode m_insertionmode;
quint8 m_lineWidth;
QHexPosition m_position, m_selection;
};