This repository has been archived on 2020-09-07. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
libs/qad/widgets/qpiconsole.h

188 lines
7.3 KiB
C++

#ifndef QPICONSOLE_H
#define QPICONSOLE_H
#include <QTabWidget>
#include <QLabel>
#include <QBoxLayout>
#include <QFormLayout>
#include <QSpacerItem>
#include <QDebug>
typedef long long llong;
typedef unsigned char uchar;
typedef unsigned short int ushort;
typedef unsigned int uint;
typedef unsigned long ulong;
typedef unsigned long long ullong;
typedef long double ldouble;
QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
class QPIConsole: public QTabWidget {
Q_OBJECT
public:
QPIConsole(QWidget * parent = 0);
enum Format {Normal = 0x01,
Bold = 0x02,
Italic = 0x08,
Underline = 0x10,
Inverse = 0x40,
Black = 0x100,
Red = 0x200,
Green = 0x400,
Yellow = 0x800,
Blue = 0x1000,
Magenta = 0x2000,
Cyan = 0x4000,
White = 0x8000,
BackBlack = 0x10000,
BackRed = 0x20000,
BackGreen = 0x40000,
BackYellow = 0x80000,
BackBlue = 0x100000,
BackMagenta = 0x200000,
BackCyan = 0x400000,
BackWhite = 0x800000,
Dec = 0x1000000,
Hex = 0x2000000,
Oct = 0x4000000,
Bin = 0x8000000,
Scientific = 0x10000000,
Lighter = 0x20000000,
Darker = 0x40000000,
BackLighter = 0x80000000
};
Q_DECLARE_FLAGS(Formats, Format)
Q_FLAGS(Formats)
Q_ENUMS(Format)
Q_PROPERTY(Qt::Alignment defaultAlignment READ defaultAlignment WRITE setDefaultAlignment)
void addString(const QString & name, int column = 1, Formats format = QPIConsole::Normal);
void addVariable(const QString & name, const QString * ptr, int column = 1, Formats format = QPIConsole::Normal);
void addVariable(const QString & name, const char * ptr, int column = 1, Formats format = QPIConsole::Normal);
void addVariable(const QString & name, const bool * ptr, int column = 1, Formats format = QPIConsole::Normal);
void addVariable(const QString & name, const short * ptr, int column = 1, Formats format = QPIConsole::Normal);
void addVariable(const QString & name, const int * ptr, int column = 1, Formats format = QPIConsole::Normal);
void addVariable(const QString & name, const long * ptr, int column = 1, Formats format = QPIConsole::Normal);
void addVariable(const QString & name, const llong * ptr, int column = 1, Formats format = QPIConsole::Normal);
void addVariable(const QString & name, const uchar * ptr, int column = 1, Formats format = QPIConsole::Normal);
void addVariable(const QString & name, const ushort * ptr, int column = 1, Formats format = QPIConsole::Normal);
void addVariable(const QString & name, const uint * ptr, int column = 1, Formats format = QPIConsole::Normal);
void addVariable(const QString & name, const ulong * ptr, int column = 1, Formats format = QPIConsole::Normal);
void addVariable(const QString & name, const ullong * ptr, int column = 1, Formats format = QPIConsole::Normal);
void addVariable(const QString & name, const float * ptr, int column = 1, Formats format = QPIConsole::Normal);
void addVariable(const QString & name, const double * ptr, int column = 1, Formats format = QPIConsole::Normal);
void addBitVariable(const QString & name, const void * ptr, int fromBit, int bitCount, int column = 1, Formats format = QPIConsole::Normal);
void addEmptyLine(int column = 1, uint count = 1);
uint tabsCount() const {return tabs.size();}
QString currentTab() const {return tabs[cur_tab].name;}
int addTab(const QString & name, char bind_key = 0);
bool removeTab(uint index);
bool removeTab(const QString & name) {return removeTab(tabIndex(name));}
bool renameTab(uint index, const QString & new_name);
bool renameTab(const QString & name, const QString & new_name) {return renameTab(tabIndex(name), new_name);}
void setTabEnabled(int index, bool on);
bool setTab(uint index);
bool setTab(const QString & name) {return setTab(tabIndex(name));}
//void clearTabs(bool clearScreen = true) {if (clearScreen && isRunning()) {toUpperLeft(); clearScreenLower();} tabs.clear();}
void addCustomStatus(const QString & str, Formats format = QPIConsole::Normal) {tabs[cur_tab].widget->setText(str); applyFormat(tabs[cur_tab].widget, format);}
void clearCustomStatus() {tabs[cur_tab].widget->clear();}
Qt::Alignment defaultAlignment() const {return def_align;}
void setDefaultAlignment(Qt::Alignment align) {def_align = align;}
void setColumnAlignment(int col, Qt::Alignment align) {if (col < 0 || col >= columns().size()) return; column(col).alignment = align;}
void setColumnAlignmentToAll(Qt::Alignment align) {for (int i = 0; i < tabs.size(); ++i) for (int j = 0; j < tabs[i].columns.size(); ++j) tabs[i].columns[j].alignment = align;/* fillLabels();*/}
void clearVariables() {clearVariables(true);}
void clearVariables(bool clearScreen) {/*if (clearScreen && isRunning()) {toUpperLeft(); clearScreenLower();}*/ columns().clear();}
private:
void timerEvent(QTimerEvent * );
QSize sizeHint() const {return QSize(100, 100);}
void checkColumn(int col);
void applyFormat(QLabel * l, Formats f);
int bitsValue(const void * src, int offset, int count) const;
int tabIndex(const QString & n) const {for (int i = 0; i < tabs.size(); ++i) if (tabs[i].name == n) return i; return -1;}
const QString & toBin(const void * d, int s);
template <typename T>
QString numIntString(T v, Formats f, int bits = 0) {
if (f.testFlag(QPIConsole::Hex)) return "0x" + QString::number(v, 16).toUpper();
if (f.testFlag(QPIConsole::Dec)) return QString::number(v);
if (f.testFlag(QPIConsole::Oct)) return "0" + QString::number(v, 8);
if (f.testFlag(QPIConsole::Bin)) return toBin(&v, bits);
return QString::number(v);
}
template <typename T>
QString numFloatString(T v, Formats f) {
if (f.testFlag(QPIConsole::Scientific)) return QString::number(v, 'E', 5);
return QString::number(v);
}
struct Variable {
Variable() {label = widget = 0;}
QString name;
Formats format;
int type;
int bitFrom;
int bitCount;
const void * ptr;
QLabel * label;
QLabel * widget;
void operator =(const Variable & src) {name = src.name; format = src.format; type = src.type;
bitFrom = src.bitFrom; bitCount = src.bitCount; ptr = src.ptr;}
};
struct Column {
Column(Qt::Alignment align = Qt::AlignRight) {variables.reserve(16); alignment = align;}
QVector<Variable> variables;
Qt::Alignment alignment;
QFormLayout * layout;
int size() const {return variables.size();}
Variable & operator [](int index) {return variables[index];}
const Variable & operator [](int index) const {return variables[index];}
void push_back(const Variable & v) {variables.push_back(v);}
void operator =(const Column & src) {variables = src.variables; alignment = src.alignment;}
};
struct Tab {
Tab(QString n = "", char k = 0) {columns.reserve(16); name = n; key = k;}
QVector<Column> columns;
QString name;
char key;
QHBoxLayout * layout;
QLabel * widget;
};
QVector<Column> & columns() {return tabs[cur_tab].columns;}
Column & column(int index) {return tabs[cur_tab].columns[index - 1];}
Qt::Alignment def_align;
QVector<Tab> tabs;
QString binstr;
Variable tv;
int cur_tab, timer;
private slots:
void tabChanged(int tab) {cur_tab = tab;}
public slots:
void start(float freq = 40) {if (timer >= 0) killTimer(timer); timer = startTimer(freq > 0. ? 1000 / freq : 25);}
void stop() {if (timer >= 0) killTimer(timer); timer = -1;}
};
Q_DECLARE_OPERATORS_FOR_FLAGS(QPIConsole::Formats)
QT_END_NAMESPACE
QT_END_HEADER
#endif // QPICONSOLE_H