#include "SeerArrayVisualizerWidget.h" #include "SeerUtl.h" #include #include #include #include #include #include #include #include #include SeerArrayVisualizerWidget::SeerArrayVisualizerWidget (QWidget* parent) : QWidget(parent) { // Init variables. _variableId = Seer::createID(); // Create two id's for queries. _memoryId = Seer::createID(); // Set up UI. setupUi(this); // Setup the widgets setWindowIcon(QIcon(":/seer/resources/seer_64x64.png")); setWindowTitle("Seer Array Visualizer"); arrayLengthLineEdit->setValidator(new QIntValidator(1, 9999999, this)); columnCountSpinBox->setValue(arrayTableWidget->elementsPerLine()); arrayDisplayFormatComboBox->setCurrentIndex(0); handleArrayDisplayFormatComboBox(0); // Connect things. QObject::connect(refreshToolButton, &QToolButton::clicked, this, &SeerArrayVisualizerWidget::handleRefreshButton); QObject::connect(arrayLengthLineEdit, &QLineEdit::returnPressed, this, &SeerArrayVisualizerWidget::handleRefreshButton); QObject::connect(variableNameLineEdit, &QLineEdit::returnPressed, this, &SeerArrayVisualizerWidget::handleVariableNameLineEdit); QObject::connect(arrayDisplayFormatComboBox, QOverload::of(&QComboBox::currentIndexChanged), this, &SeerArrayVisualizerWidget::handleArrayDisplayFormatComboBox); QObject::connect(columnCountSpinBox, QOverload::of(&QSpinBox::valueChanged), this, &SeerArrayVisualizerWidget::handleColumnCountSpinBox); // Restore window settings. readSettings(); } SeerArrayVisualizerWidget::~SeerArrayVisualizerWidget () { } void SeerArrayVisualizerWidget::setVariableName (const QString& name) { setWindowTitle("Seer Array Visualizer - '" + name + "'"); variableNameLineEdit->setText(name); setVariableAddress(""); if (variableNameLineEdit->text() == "") { return; } // Clear old contents. QByteArray array; arrayTableWidget->setData(new SeerArrayWidget::DataStorageArray(array)); // Send signal to get variable address. emit evaluateVariableExpression(_variableId, variableNameLineEdit->text()); } QString SeerArrayVisualizerWidget::variableName () const { return variableNameLineEdit->text(); } void SeerArrayVisualizerWidget::setVariableAddress (const QString& address) { unsigned long offset = 0; bool ok = false; if (address.startsWith("0x")) { offset = address.toULong(&ok, 16); if (ok == true) { variableAddressLineEdit->setText(address); }else{ variableAddressLineEdit->setText("not an address"); offset = 0; } }else{ variableAddressLineEdit->setText("not an address"); offset = 0; } //qDebug() << address << offset << ok; arrayTableWidget->setAddressOffset(offset); } QString SeerArrayVisualizerWidget::variableAddress () const { return variableAddressLineEdit->text(); } void SeerArrayVisualizerWidget::handleText (const QString& text) { //qDebug() << text; if (text.contains(QRegExp("^([0-9]+)\\^done,value="))) { // 10^done,value="1" // 11^done,value="0x7fffffffd538" QString id_text = text.section('^', 0,0); if (id_text.toInt() == _variableId) { QStringList words = Seer::filterEscapes(Seer::parseFirst(text, "value=", '"', '"', false)).split(' ', QString::SkipEmptyParts); setVariableAddress(words.first()); } }else if (text.contains(QRegExp("^([0-9]+)\\^done,memory="))) { // 3^done,memory=[{begin="0x0000000000613e70",offset="0x0000000000000000",end="0x0000000000613e71",contents="00"}] // 4^done,memory=[{begin="0x0000000000613e70",offset="0x0000000000000000",end="0x0000000000613ed4",contents="000000000000000000000000"}] QString id_text = text.section('^', 0,0); if (id_text.toInt() == _memoryId) { qDebug() << text; QString memory_text = Seer::parseFirst(text, "memory=", '[', ']', false); QStringList range_list = Seer::parse(memory_text, "", '{', '}', false); // Loop through the memory ranges. for ( const auto& range_text : range_list ) { QString contents_text = Seer::parseFirst(range_text, "contents=", '"', '"', false); //qDebug() << contents_text; // Convert hex string to byte array. QByteArray array; for (int i = 0; isetData(new SeerArrayWidget::DataStorageArray(array)); break; // Take just the first range for now. } } }else if (text.contains(QRegExp("^([0-9]+)\\^error,msg="))) { // 12^error,msg="No symbol \"return\" in current context." // 13^error,msg="No symbol \"cout\" in current context." // 3^error,msg="Unable to read memory." QString id_text = text.section('^', 0,0); if (id_text.toInt() == _variableId) { variableAddressLineEdit->setText( Seer::filterEscapes(Seer::parseFirst(text, "msg=", '"', '"', false)) ); } if (id_text.toInt() == _memoryId) { // Display the error message. QString msg_text = Seer::parseFirst(text, "msg=", false); if (msg_text != "") { QMessageBox::warning(this, "Error.", Seer::filterEscapes(msg_text)); } } }else{ // Ignore anything else. } } void SeerArrayVisualizerWidget::handleRefreshButton () { if (variableNameLineEdit->text() == "") { return; } if (variableAddressLineEdit->text() == "") { return; } if (variableAddressLineEdit->text() == "not an address") { return; } int bytes = arrayLengthLineEdit->text().toInt() * Seer::typeBytes(arrayDisplayFormatComboBox->currentText()); qDebug() << _memoryId << variableAddressLineEdit->text() << arrayLengthLineEdit->text() << arrayDisplayFormatComboBox->currentText() << bytes; emit evaluateMemoryExpression(_memoryId, variableAddressLineEdit->text(), bytes); } void SeerArrayVisualizerWidget::handleVariableNameLineEdit () { setVariableName (variableNameLineEdit->text()); } void SeerArrayVisualizerWidget::handleArrayDisplayFormatComboBox (int index) { qDebug() << index; if (index == 0) { arrayTableWidget->setArrayMode(SeerArrayWidget::Int16ArrayMode); }else if (index == 1) { arrayTableWidget->setArrayMode(SeerArrayWidget::Int32ArrayMode); }else if (index == 2) { arrayTableWidget->setArrayMode(SeerArrayWidget::Int64ArrayMode); }else if (index == 3) { arrayTableWidget->setArrayMode(SeerArrayWidget::UInt16ArrayMode); }else if (index == 4) { arrayTableWidget->setArrayMode(SeerArrayWidget::UInt32ArrayMode); }else if (index == 5) { arrayTableWidget->setArrayMode(SeerArrayWidget::UInt64ArrayMode); }else if (index == 6) { arrayTableWidget->setArrayMode(SeerArrayWidget::Float32ArrayMode); }else if (index == 7) { arrayTableWidget->setArrayMode(SeerArrayWidget::Float64ArrayMode); }else{ // Do nothing. } } void SeerArrayVisualizerWidget::handleColumnCountSpinBox (int value) { arrayTableWidget->setElementsPerLine(value); } void SeerArrayVisualizerWidget::writeSettings() { QSettings settings; settings.beginGroup("arrayvisualizerwindow"); settings.setValue("size", size()); settings.endGroup(); //qDebug() << size(); } void SeerArrayVisualizerWidget::readSettings() { QSettings settings; settings.beginGroup("arrayvisualizerwindow"); resize(settings.value("size", QSize(800, 400)).toSize()); settings.endGroup(); //qDebug() << size(); } void SeerArrayVisualizerWidget::resizeEvent (QResizeEvent* event) { writeSettings(); QWidget::resizeEvent(event); }