mirror of
https://github.com/citra-emu/citra.git
synced 2024-12-24 11:50:05 +00:00
241 lines
8.7 KiB
C
241 lines
8.7 KiB
C
|
// Original author: Winfried Simon
|
||
|
// See http://code.google.com/p/qhexedit2/
|
||
|
// Huge thanks!
|
||
|
|
||
|
#ifndef QHEXEDIT_H
|
||
|
#define QHEXEDIT_H
|
||
|
|
||
|
#include <QtGui>
|
||
|
#include "qhexedit_p.h"
|
||
|
|
||
|
/** \mainpage
|
||
|
QHexEdit is a binary editor widget for Qt.
|
||
|
|
||
|
\version Version 0.6.3
|
||
|
\image html hexedit.png
|
||
|
*/
|
||
|
|
||
|
|
||
|
/*! QHexEdit is a hex editor widget written in C++ for the Qt (Qt4) framework.
|
||
|
It is a simple editor for binary data, just like QPlainTextEdit is for text
|
||
|
data. There are sip configuration files included, so it is easy to create
|
||
|
bindings for PyQt and you can use this widget also in python.
|
||
|
|
||
|
QHexEdit takes the data of a QByteArray (setData()) and shows it. You can use
|
||
|
the mouse or the keyboard to navigate inside the widget. If you hit the keys
|
||
|
(0..9, a..f) you will change the data. Changed data is highlighted and can be
|
||
|
accessed via data().
|
||
|
|
||
|
Normaly QHexEdit works in the overwrite Mode. You can set overwriteMode(false)
|
||
|
and insert data. In this case the size of data() increases. It is also possible
|
||
|
to delete bytes (del or backspace), here the size of data decreases.
|
||
|
|
||
|
You can select data with keyboard hits or mouse movements. The copy-key will
|
||
|
copy the selected data into the clipboard. The cut-key copies also but delets
|
||
|
it afterwards. In overwrite mode, the paste function overwrites the content of
|
||
|
the (does not change the length) data. In insert mode, clipboard data will be
|
||
|
inserted. The clipboard content is expected in ASCII Hex notation. Unknown
|
||
|
characters will be ignored.
|
||
|
|
||
|
QHexEdit comes with undo/redo functionality. All changes can be undone, by
|
||
|
pressing the undo-key (usually ctr-z). They can also be redone afterwards.
|
||
|
The undo/redo framework is cleared, when setData() sets up a new
|
||
|
content for the editor. You can search data inside the content with indexOf()
|
||
|
and lastIndexOf(). The replace() function is to change located subdata. This
|
||
|
'replaced' data can also be undone by the undo/redo framework.
|
||
|
|
||
|
This widget can only handle small amounts of data. The size has to be below 10
|
||
|
megabytes, otherwise the scroll sliders ard not shown and you can't scroll any
|
||
|
more.
|
||
|
*/
|
||
|
class QHexEdit : public QScrollArea
|
||
|
{
|
||
|
Q_OBJECT
|
||
|
/*! Property data holds the content of QHexEdit. Call setData() to set the
|
||
|
content of QHexEdit, data() returns the actual content.
|
||
|
*/
|
||
|
Q_PROPERTY(QByteArray data READ data WRITE setData)
|
||
|
|
||
|
/*! Property addressOffset is added to the Numbers of the Address Area.
|
||
|
A offset in the address area (left side) is sometimes usefull, whe you show
|
||
|
only a segment of a complete memory picture. With setAddressOffset() you set
|
||
|
this property - with addressOffset() you get the actual value.
|
||
|
*/
|
||
|
Q_PROPERTY(int addressOffset READ addressOffset WRITE setAddressOffset)
|
||
|
|
||
|
/*! Property address area color sets (setAddressAreaColor()) the backgorund
|
||
|
color of address areas. You can also read the color (addressaAreaColor()).
|
||
|
*/
|
||
|
Q_PROPERTY(QColor addressAreaColor READ addressAreaColor WRITE setAddressAreaColor)
|
||
|
|
||
|
/*! Porperty cursorPosition sets or gets the position of the editor cursor
|
||
|
in QHexEdit.
|
||
|
*/
|
||
|
Q_PROPERTY(int cursorPosition READ cursorPosition WRITE setCursorPosition)
|
||
|
|
||
|
/*! Property highlighting color sets (setHighlightingColor()) the backgorund
|
||
|
color of highlighted text areas. You can also read the color
|
||
|
(highlightingColor()).
|
||
|
*/
|
||
|
Q_PROPERTY(QColor highlightingColor READ highlightingColor WRITE setHighlightingColor)
|
||
|
|
||
|
/*! Property selection color sets (setSelectionColor()) the backgorund
|
||
|
color of selected text areas. You can also read the color
|
||
|
(selectionColor()).
|
||
|
*/
|
||
|
Q_PROPERTY(QColor selectionColor READ selectionColor WRITE setSelectionColor)
|
||
|
|
||
|
/*! Porperty overwrite mode sets (setOverwriteMode()) or gets (overwriteMode()) the mode
|
||
|
in which the editor works. In overwrite mode the user will overwrite existing data. The
|
||
|
size of data will be constant. In insert mode the size will grow, when inserting
|
||
|
new data.
|
||
|
*/
|
||
|
Q_PROPERTY(bool overwriteMode READ overwriteMode WRITE setOverwriteMode)
|
||
|
|
||
|
/*! Porperty readOnly sets (setReadOnly()) or gets (isReadOnly) the mode
|
||
|
in which the editor works. In readonly mode the the user can only navigate
|
||
|
through the data and select data; modifying is not possible. This
|
||
|
property's default is false.
|
||
|
*/
|
||
|
Q_PROPERTY(bool readOnly READ isReadOnly WRITE setReadOnly)
|
||
|
|
||
|
/*! Set the font of the widget. Please use fixed width fonts like Mono or Courier.*/
|
||
|
Q_PROPERTY(QFont font READ font WRITE setFont)
|
||
|
|
||
|
|
||
|
public:
|
||
|
/*! Creates an instance of QHexEdit.
|
||
|
\param parent Parent widget of QHexEdit.
|
||
|
*/
|
||
|
QHexEdit(QWidget *parent = 0);
|
||
|
|
||
|
/*! Returns the index position of the first occurrence
|
||
|
of the byte array ba in this byte array, searching forward from index position
|
||
|
from. Returns -1 if ba could not be found. In addition to this functionality
|
||
|
of QByteArray the cursorposition is set to the end of found bytearray and
|
||
|
it will be selected.
|
||
|
|
||
|
*/
|
||
|
int indexOf(const QByteArray & ba, int from = 0) const;
|
||
|
|
||
|
/*! Inserts a byte array.
|
||
|
\param i Index position, where to insert
|
||
|
\param ba byte array, which is to insert
|
||
|
In overwrite mode, the existing data will be overwritten, in insertmode ba will be
|
||
|
inserted and size of data grows.
|
||
|
*/
|
||
|
void insert(int i, const QByteArray & ba);
|
||
|
|
||
|
/*! Inserts a char.
|
||
|
\param i Index position, where to insert
|
||
|
\param ch Char, which is to insert
|
||
|
In overwrite mode, the existing data will be overwritten, in insertmode ba will be
|
||
|
inserted and size of data grows.
|
||
|
*/
|
||
|
void insert(int i, char ch);
|
||
|
|
||
|
/*! Returns the index position of the last occurrence
|
||
|
of the byte array ba in this byte array, searching backwards from index position
|
||
|
from. Returns -1 if ba could not be found. In addition to this functionality
|
||
|
of QByteArray the cursorposition is set to the beginning of found bytearray and
|
||
|
it will be selected.
|
||
|
|
||
|
*/
|
||
|
int lastIndexOf(const QByteArray & ba, int from = 0) const;
|
||
|
|
||
|
/*! Removes len bytes from the content.
|
||
|
\param pos Index position, where to remove
|
||
|
\param len Amount of bytes to remove
|
||
|
In overwrite mode, the existing bytes will be overwriten with 0x00.
|
||
|
*/
|
||
|
void remove(int pos, int len=1);
|
||
|
|
||
|
/*! Replaces len bytes from index position pos with the byte array after.
|
||
|
*/
|
||
|
void replace( int pos, int len, const QByteArray & after);
|
||
|
|
||
|
/*! Gives back a formatted image of the content of QHexEdit
|
||
|
*/
|
||
|
QString toReadableString();
|
||
|
|
||
|
/*! Gives back a formatted image of the selected content of QHexEdit
|
||
|
*/
|
||
|
QString selectionToReadableString();
|
||
|
|
||
|
/*! \cond docNever */
|
||
|
void setAddressOffset(int offset);
|
||
|
int addressOffset();
|
||
|
void setCursorPosition(int cusorPos);
|
||
|
int cursorPosition();
|
||
|
void setData(QByteArray const &data);
|
||
|
QByteArray data();
|
||
|
void setAddressAreaColor(QColor const &color);
|
||
|
QColor addressAreaColor();
|
||
|
void setHighlightingColor(QColor const &color);
|
||
|
QColor highlightingColor();
|
||
|
void setSelectionColor(QColor const &color);
|
||
|
QColor selectionColor();
|
||
|
void setOverwriteMode(bool);
|
||
|
bool overwriteMode();
|
||
|
void setReadOnly(bool);
|
||
|
bool isReadOnly();
|
||
|
const QFont &font() const;
|
||
|
void setFont(const QFont &);
|
||
|
/*! \endcond docNever */
|
||
|
|
||
|
public slots:
|
||
|
/*! Redoes the last operation. If there is no operation to redo, i.e.
|
||
|
there is no redo step in the undo/redo history, nothing happens.
|
||
|
*/
|
||
|
void redo();
|
||
|
|
||
|
/*! Set the minimum width of the address area.
|
||
|
\param addressWidth Width in characters.
|
||
|
*/
|
||
|
void setAddressWidth(int addressWidth);
|
||
|
|
||
|
/*! Switch the address area on or off.
|
||
|
\param addressArea true (show it), false (hide it).
|
||
|
*/
|
||
|
void setAddressArea(bool addressArea);
|
||
|
|
||
|
/*! Switch the ascii area on or off.
|
||
|
\param asciiArea true (show it), false (hide it).
|
||
|
*/
|
||
|
void setAsciiArea(bool asciiArea);
|
||
|
|
||
|
/*! Switch the highlighting feature on or of.
|
||
|
\param mode true (show it), false (hide it).
|
||
|
*/
|
||
|
void setHighlighting(bool mode);
|
||
|
|
||
|
/*! Undoes the last operation. If there is no operation to undo, i.e.
|
||
|
there is no undo step in the undo/redo history, nothing happens.
|
||
|
*/
|
||
|
void undo();
|
||
|
|
||
|
signals:
|
||
|
|
||
|
/*! Contains the address, where the cursor is located. */
|
||
|
void currentAddressChanged(int address);
|
||
|
|
||
|
/*! Contains the size of the data to edit. */
|
||
|
void currentSizeChanged(int size);
|
||
|
|
||
|
/*! The signal is emited every time, the data is changed. */
|
||
|
void dataChanged();
|
||
|
|
||
|
/*! The signal is emited every time, the overwrite mode is changed. */
|
||
|
void overwriteModeChanged(bool state);
|
||
|
|
||
|
private:
|
||
|
/*! \cond docNever */
|
||
|
QHexEditPrivate *qHexEdit_p;
|
||
|
QHBoxLayout *layout;
|
||
|
QScrollArea *scrollArea;
|
||
|
/*! \endcond docNever */
|
||
|
};
|
||
|
|
||
|
#endif
|
||
|
|