355 lines
12 KiB
C++
355 lines
12 KiB
C++
#include "qpiconsole.h"
|
|
|
|
|
|
QPIConsole::QPIConsole(QWidget * parent): QTabWidget(parent) {
|
|
connect(this, SIGNAL(currentChanged(int)), this, SLOT(tabChanged(int)));
|
|
cur_tab = timer = -1;
|
|
def_align = Qt::AlignCenter;
|
|
}
|
|
|
|
|
|
void QPIConsole::timerEvent(QTimerEvent *) {
|
|
for (int i = 0; i < columns().size(); ++i) {
|
|
Column & ccol(tabs[cur_tab].columns[i]);
|
|
QVector<Variable> & cvars(ccol.variables);
|
|
if (ccol.alignment.testFlag(Qt::AlignLeft)) {
|
|
ccol.layout->setLabelAlignment(Qt::AlignLeft);
|
|
} else {
|
|
ccol.layout->setLabelAlignment(Qt::AlignRight);
|
|
}
|
|
for (int j = 0; j < cvars.size(); ++j) {
|
|
Variable & tv(cvars[j]);
|
|
tv.label->setText(tv.name);
|
|
if (tv.type >= 0) {
|
|
if (ccol.alignment.testFlag(Qt::AlignLeft)) {
|
|
tv.label->setAlignment(Qt::AlignLeft);
|
|
if (tv.widget != 0) tv.widget->setAlignment(Qt::AlignLeft);
|
|
} else {
|
|
if (ccol.alignment.testFlag(Qt::AlignRight)) {
|
|
tv.label->setAlignment(Qt::AlignRight);
|
|
if (tv.widget != 0) tv.widget->setAlignment(Qt::AlignRight);
|
|
} else {
|
|
tv.label->setAlignment(Qt::AlignRight);
|
|
if (tv.widget != 0) tv.widget->setAlignment(Qt::AlignLeft);
|
|
}
|
|
}
|
|
}
|
|
if (tv.widget == 0) continue;
|
|
if (tv.type <= 0 && tv.ptr == 0) continue;
|
|
if (tv.ptr != 0) {
|
|
switch (tv.type) {
|
|
case 0: tv.widget->setText((tv.ptr != 0 ? *(const QString *)tv.ptr : QString())); break;
|
|
case 1: tv.widget->setText((tv.ptr != 0 ? *(const bool *)tv.ptr : false) ? "true" : "false"); break;
|
|
case 2: tv.widget->setText(numIntString<int>(tv.ptr != 0 ? *(const int *)tv.ptr : 0, tv.format)); break;
|
|
case 3: tv.widget->setText(numIntString<long>(tv.ptr != 0 ? *(const long *)tv.ptr : 0l, tv.format)); break;
|
|
case 4: tv.widget->setText(QString(tv.ptr != 0 ? *(const char *)tv.ptr : char(0))); break;
|
|
case 5: tv.widget->setText(numFloatString<float>(tv.ptr != 0 ? *(const float *)tv.ptr : 0.f, tv.format)); break;
|
|
case 6: tv.widget->setText(numFloatString<double>(tv.ptr != 0 ? *(const double *)tv.ptr : 0., tv.format)); break;
|
|
case 7: tv.widget->setText(numFloatString<short>(tv.ptr != 0 ? *(const short *)tv.ptr : short(0), tv.format)); break;
|
|
case 8: tv.widget->setText(numIntString<uint>(tv.ptr != 0 ? *(const uint *)tv.ptr : 0u, tv.format)); break;
|
|
case 9: tv.widget->setText(numIntString<ulong>(tv.ptr != 0 ? *(const ulong *)tv.ptr : 0ul, tv.format)); break;
|
|
case 10: tv.widget->setText(numIntString<ushort>(tv.ptr != 0 ? *(const ushort *)tv.ptr : ushort(0), tv.format)); break;
|
|
case 11: tv.widget->setText(numIntString<uchar>(tv.ptr != 0 ? *(const uchar *)tv.ptr : uchar(0), tv.format)); break;
|
|
case 12: tv.widget->setText(numIntString<llong>(tv.ptr != 0 ? *(const llong *)tv.ptr : 0l, tv.format)); break;
|
|
case 13: tv.widget->setText(numIntString<ullong>(tv.ptr != 0 ? *(const ullong *)tv.ptr : 0ull, tv.format)); break;
|
|
case 14:
|
|
tv.widget->setText(numIntString<int>(bitsValue(tv.ptr, tv.bitFrom, tv.bitCount), tv.format, tv.bitCount / 8));
|
|
break;
|
|
default: break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
#define ADD_VAR_BODY \
|
|
tv.name = name; \
|
|
if (!tv.name.isEmpty()) tv.name += ":"; \
|
|
tv.bitFrom = tv.bitCount = 0; \
|
|
tv.format = format; \
|
|
checkColumn(col);
|
|
#define ADD_VAR_SBODY \
|
|
tv.name = name; \
|
|
tv.bitFrom = tv.bitCount = 0; \
|
|
tv.format = format; \
|
|
checkColumn(col);
|
|
|
|
#define ADD_VAR_QT \
|
|
QLabel * lbl = new QLabel(name); \
|
|
QLabel * w = new QLabel(); \
|
|
lbl->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); \
|
|
w->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); \
|
|
column(col).variables.back().label = lbl; \
|
|
column(col).variables.back().widget = w; \
|
|
lbl->setAlignment(column(col).alignment); \
|
|
applyFormat(lbl, format); \
|
|
applyFormat(w, format); \
|
|
column(col).layout->addRow(lbl, w);
|
|
|
|
void QPIConsole::addString(const QString & name, int col, Formats format) {
|
|
ADD_VAR_SBODY tv.type = -1;
|
|
tv.ptr = 0;
|
|
column(col).push_back(tv);
|
|
QLabel * lbl = new QLabel(name);
|
|
lbl->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
|
|
column(col).variables.back().label = lbl;
|
|
column(col).variables.back().widget = 0;
|
|
lbl->setAlignment(column(col).alignment);
|
|
applyFormat(lbl, format);
|
|
column(col).layout->addRow(lbl);
|
|
}
|
|
void QPIConsole::addVariable(const QString & name, const QString * ptr, int col, Formats format) {
|
|
ADD_VAR_BODY tv.type = 0;
|
|
tv.ptr = ptr;
|
|
column(col).push_back(tv);
|
|
ADD_VAR_QT
|
|
}
|
|
void QPIConsole::addVariable(const QString & name, const bool * ptr, int col, Formats format) {
|
|
ADD_VAR_BODY tv.type = 1;
|
|
tv.ptr = ptr;
|
|
column(col).push_back(tv);
|
|
ADD_VAR_QT
|
|
}
|
|
void QPIConsole::addVariable(const QString & name, const int * ptr, int col, Formats format) {
|
|
ADD_VAR_BODY tv.type = 2;
|
|
tv.ptr = ptr;
|
|
column(col).push_back(tv);
|
|
ADD_VAR_QT
|
|
}
|
|
void QPIConsole::addVariable(const QString & name, const long * ptr, int col, Formats format) {
|
|
ADD_VAR_BODY tv.type = 3;
|
|
tv.ptr = ptr;
|
|
column(col).push_back(tv);
|
|
ADD_VAR_QT
|
|
}
|
|
void QPIConsole::addVariable(const QString & name, const char * ptr, int col, Formats format) {
|
|
ADD_VAR_BODY tv.type = 4;
|
|
tv.ptr = ptr;
|
|
column(col).push_back(tv);
|
|
ADD_VAR_QT
|
|
}
|
|
void QPIConsole::addVariable(const QString & name, const float * ptr, int col, Formats format) {
|
|
ADD_VAR_BODY tv.type = 5;
|
|
tv.ptr = ptr;
|
|
column(col).push_back(tv);
|
|
ADD_VAR_QT
|
|
}
|
|
void QPIConsole::addVariable(const QString & name, const double * ptr, int col, Formats format) {
|
|
ADD_VAR_BODY tv.type = 6;
|
|
tv.ptr = ptr;
|
|
column(col).push_back(tv);
|
|
ADD_VAR_QT
|
|
}
|
|
void QPIConsole::addVariable(const QString & name, const short * ptr, int col, Formats format) {
|
|
ADD_VAR_BODY tv.type = 7;
|
|
tv.ptr = ptr;
|
|
column(col).push_back(tv);
|
|
ADD_VAR_QT
|
|
}
|
|
void QPIConsole::addVariable(const QString & name, const uint * ptr, int col, Formats format) {
|
|
ADD_VAR_BODY tv.type = 8;
|
|
tv.ptr = ptr;
|
|
column(col).push_back(tv);
|
|
ADD_VAR_QT
|
|
}
|
|
void QPIConsole::addVariable(const QString & name, const ulong * ptr, int col, Formats format) {
|
|
ADD_VAR_BODY tv.type = 9;
|
|
tv.ptr = ptr;
|
|
column(col).push_back(tv);
|
|
ADD_VAR_QT
|
|
}
|
|
void QPIConsole::addVariable(const QString & name, const ushort * ptr, int col, Formats format) {
|
|
ADD_VAR_BODY tv.type = 10;
|
|
tv.ptr = ptr;
|
|
column(col).push_back(tv);
|
|
ADD_VAR_QT
|
|
}
|
|
void QPIConsole::addVariable(const QString & name, const uchar * ptr, int col, Formats format) {
|
|
ADD_VAR_BODY tv.type = 11;
|
|
tv.ptr = ptr;
|
|
column(col).push_back(tv);
|
|
ADD_VAR_QT
|
|
}
|
|
void QPIConsole::addVariable(const QString & name, const llong * ptr, int col, Formats format) {
|
|
ADD_VAR_BODY tv.type = 12;
|
|
tv.ptr = ptr;
|
|
column(col).push_back(tv);
|
|
ADD_VAR_QT
|
|
}
|
|
void QPIConsole::addVariable(const QString & name, const ullong * ptr, int col, Formats format) {
|
|
ADD_VAR_BODY tv.type = 13;
|
|
tv.ptr = ptr;
|
|
column(col).push_back(tv);
|
|
ADD_VAR_QT
|
|
}
|
|
void QPIConsole::addBitVariable(const QString & name, const void * ptr, int fromBit, int bitCount, int col, Formats format) {
|
|
tv.name = name;
|
|
tv.bitFrom = fromBit;
|
|
tv.bitCount = bitCount;
|
|
tv.type = 14;
|
|
tv.ptr = ptr;
|
|
tv.format = format;
|
|
checkColumn(col);
|
|
column(col).push_back(tv);
|
|
ADD_VAR_QT
|
|
}
|
|
void QPIConsole::addEmptyLine(int col, uint count) {
|
|
tv.name = "";
|
|
tv.type = 0;
|
|
tv.ptr = 0;
|
|
tv.format = Normal;
|
|
for (uint i = 0; i < count; ++i) {
|
|
checkColumn(col);
|
|
column(col).push_back(tv);
|
|
QLabel * lbl = new QLabel();
|
|
lbl->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
|
|
column(col).variables.back().label = lbl;
|
|
column(col).variables.back().widget = 0;
|
|
lbl->setAlignment(column(col).alignment);
|
|
applyFormat(lbl, tv.format);
|
|
column(col).layout->addRow(lbl);
|
|
}
|
|
}
|
|
|
|
|
|
int QPIConsole::addTab(const QString & name, char bind_key) {
|
|
QWidget * w = new QWidget();
|
|
QVBoxLayout * lay = new QVBoxLayout();
|
|
QHBoxLayout * clay = new QHBoxLayout();
|
|
QLabel * lbl = new QLabel();
|
|
lay->setContentsMargins(2, 2, 2, 2);
|
|
clay->setContentsMargins(0, 0, 0, 0);
|
|
lay->addLayout(clay);
|
|
lay->addSpacerItem(new QSpacerItem(1, 1, QSizePolicy::Preferred, QSizePolicy::Expanding));
|
|
lay->addWidget(lbl);
|
|
w->setLayout(lay);
|
|
QTabWidget::addTab(w, name);
|
|
tabs.push_back(Tab(name, bind_key));
|
|
tabs.back().layout = clay;
|
|
tabs.back().widget = lbl;
|
|
cur_tab = tabs.size() - 1;
|
|
setCurrentIndex(cur_tab);
|
|
return tabs.size();
|
|
}
|
|
|
|
|
|
void QPIConsole::checkColumn(int col) {
|
|
while (columns().size() < col) {
|
|
QFormLayout * lay = new QFormLayout();
|
|
lay->setContentsMargins(2, 2, 2, 2);
|
|
lay->setFieldGrowthPolicy(QFormLayout::AllNonFixedFieldsGrow);
|
|
columns().push_back(Column(def_align));
|
|
columns().back().layout = lay;
|
|
tabs[cur_tab].layout->addLayout(lay);
|
|
}
|
|
}
|
|
|
|
|
|
int QPIConsole::bitsValue(const void * src, int offset, int count) const {
|
|
int ret = 0, stbyte = offset / 8, cbit = offset - stbyte * 8;
|
|
char cbyte = reinterpret_cast<const char *>(src)[stbyte];
|
|
for (int i = 0; i < count; i++) {
|
|
ret |= ((cbyte >> cbit & 1) << i);
|
|
cbit++;
|
|
if (cbit == 8) {
|
|
cbit = 0;
|
|
stbyte++;
|
|
cbyte = reinterpret_cast<const char *>(src)[stbyte];
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
|
|
const QString & QPIConsole::toBin(const void * d, int s) {
|
|
binstr.clear();
|
|
uchar cc, b;
|
|
for (int i = 0; i < s; ++i) {
|
|
cc = ((const uchar *)d)[i];
|
|
b = 1;
|
|
for (int j = 0; j < 8; ++j) {
|
|
binstr.prepend(cc & b ? "1" : "0");
|
|
b <<= 1;
|
|
}
|
|
if (i < s - 1) binstr.prepend(" ");
|
|
}
|
|
return binstr;
|
|
}
|
|
|
|
|
|
void QPIConsole::applyFormat(QLabel * l, QPIConsole::Formats f) {
|
|
QColor fcol = Qt::black, bcol = QColor(0xFFFFFF);
|
|
QFont fnt = font();
|
|
|
|
if (f.testFlag(QPIConsole::Bold)) fnt.setBold(true);
|
|
if (f.testFlag(QPIConsole::Italic)) fnt.setItalic(true);
|
|
if (f.testFlag(QPIConsole::Underline)) fnt.setUnderline(true);
|
|
|
|
if (f.testFlag(QPIConsole::Black)) fcol = Qt::black;
|
|
if (f.testFlag(QPIConsole::Red)) fcol = Qt::red;
|
|
if (f.testFlag(QPIConsole::Green)) fcol = Qt::green;
|
|
if (f.testFlag(QPIConsole::Yellow)) fcol = Qt::yellow;
|
|
if (f.testFlag(QPIConsole::Blue)) fcol = Qt::blue;
|
|
if (f.testFlag(QPIConsole::Magenta)) fcol = Qt::magenta;
|
|
if (f.testFlag(QPIConsole::Cyan)) fcol = Qt::cyan;
|
|
if (f.testFlag(QPIConsole::White)) fcol = Qt::white;
|
|
if (f.testFlag(QPIConsole::Lighter)) fcol = fcol.lighter(150);
|
|
if (f.testFlag(QPIConsole::Darker)) fcol = fcol.darker(150);
|
|
|
|
if (f.testFlag(QPIConsole::BackBlack)) bcol = Qt::black;
|
|
if (f.testFlag(QPIConsole::BackRed)) bcol = Qt::red;
|
|
if (f.testFlag(QPIConsole::BackGreen)) bcol = Qt::green;
|
|
if (f.testFlag(QPIConsole::BackYellow)) bcol = Qt::yellow;
|
|
if (f.testFlag(QPIConsole::BackBlue)) bcol = Qt::blue;
|
|
if (f.testFlag(QPIConsole::BackMagenta)) bcol = Qt::magenta;
|
|
if (f.testFlag(QPIConsole::BackCyan)) bcol = Qt::cyan;
|
|
if (f.testFlag(QPIConsole::BackWhite)) bcol = Qt::white;
|
|
if (f.testFlag(QPIConsole::BackLighter)) bcol = bcol.lighter(150);
|
|
// if (f.testFlag(QPIConsole::BackDarker)) bcol = bcol.darker(150);
|
|
|
|
if (f.testFlag(QPIConsole::Inverse)) {
|
|
QColor tc = fcol;
|
|
fcol = bcol;
|
|
bcol = tc;
|
|
}
|
|
|
|
l->setFont(fnt);
|
|
QPalette pal = palette();
|
|
pal.setColor(QPalette::WindowText, fcol);
|
|
pal.setColor(QPalette::Window, bcol);
|
|
l->setPalette(pal);
|
|
l->setAutoFillBackground(bcol != QColor(0xFFFFFF));
|
|
}
|
|
|
|
|
|
bool QPIConsole::removeTab(uint index) {
|
|
if (int(index) >= tabs.size()) return false;
|
|
delete QTabWidget::widget(index);
|
|
tabs.remove(index);
|
|
return true;
|
|
}
|
|
|
|
|
|
bool QPIConsole::setTab(uint index) {
|
|
if (int(index) >= tabs.size()) return false;
|
|
setCurrentIndex(index);
|
|
return true;
|
|
}
|
|
|
|
|
|
bool QPIConsole::renameTab(uint index, const QString & new_name) {
|
|
if (int(index) >= tabs.size()) return false;
|
|
if (tabs[index].name == new_name) return true;
|
|
setTabText(index, new_name);
|
|
tabs[index].name = new_name;
|
|
return true;
|
|
}
|
|
|
|
|
|
void QPIConsole::setTabEnabled(int index, bool on) {
|
|
if (int(index) >= tabs.size()) return;
|
|
if (isTabEnabled(index) == on) return;
|
|
QTabWidget::setTabEnabled(index, on);
|
|
}
|