#include "SeerVariableLoggerBrowserWidget.h" #include "SeerUtl.h" #include #include #include #include #include #include #include #include #include SeerVariableLoggerBrowserWidget::SeerVariableLoggerBrowserWidget (QWidget* parent) : QWidget(parent) { // Construct the UI. setupUi(this); // Setup the widgets variablesTreeWidget->setMouseTracking(true); variablesTreeWidget->setSortingEnabled(false); variablesTreeWidget->setContextMenuPolicy(Qt::CustomContextMenu); variablesTreeWidget->setSelectionMode(QAbstractItemView::ExtendedSelection); variablesTreeWidget->resizeColumnToContents(0); // id variablesTreeWidget->resizeColumnToContents(1); // timestamp variablesTreeWidget->resizeColumnToContents(2); // name variablesTreeWidget->resizeColumnToContents(3); // value variablesTreeWidget->setColumnHidden(0, true); // Hide the 'number' column. variablesTreeWidget->clear(); // Connect things. QObject::connect(this, &SeerVariableLoggerBrowserWidget::evaluateVariableExpression, this, &SeerVariableLoggerBrowserWidget::handleEvaluateVariableExpression); QObject::connect(variableAddLineEdit, &QLineEdit::returnPressed, this, &SeerVariableLoggerBrowserWidget::handleAddLineEdit); QObject::connect(variableDeleteToolButton, &QToolButton::clicked, this, &SeerVariableLoggerBrowserWidget::handleDeleteToolButton); QObject::connect(variableDeleteAllToolButton, &QToolButton::clicked, this, &SeerVariableLoggerBrowserWidget::handleDeleteAllToolButton); QObject::connect(variablesTreeWidget, &QTreeWidget::itemEntered, this, &SeerVariableLoggerBrowserWidget::handleItemEntered); QObject::connect(variablesTreeWidget, &QTreeWidget::customContextMenuRequested, this, &SeerVariableLoggerBrowserWidget::handleContextMenu); } SeerVariableLoggerBrowserWidget::~SeerVariableLoggerBrowserWidget () { } void SeerVariableLoggerBrowserWidget::handleText (const QString& text) { QApplication::setOverrideCursor(Qt::BusyCursor); if (text.contains(QRegularExpression("^([0-9]+)\\^done,value="))) { //qDebug() << text; // "6^done,value=\"\\\"abc\\\"\"" QString id_text = text.section('^', 0,0); QString value_text = Seer::parseFirst(text, "value=", '"', '"', false); if (_ids.contains(id_text.toInt()) == true) { QList matches = variablesTreeWidget->findItems(id_text, Qt::MatchExactly, 0); if (matches.size() > 0) { matches.first()->setText(3, Seer::filterEscapes(value_text)); } } }else if (text.contains(QRegularExpression("^([0-9]+)\\^error,msg="))) { //qDebug() << text; // "1^error,msg=\"No symbol \\\"j\\\" in current context.\"" QString id_text = text.section('^', 0,0); QString msg_text = Seer::parseFirst(text, "msg=", '"', '"', false); if (_ids.contains(id_text.toInt()) == true) { QList matches = variablesTreeWidget->findItems(id_text, Qt::MatchExactly, 0); if (matches.size() > 0) { matches.first()->setText(2, ""); // Overwrite "name" with "" because it's not a valid "name". matches.first()->setText(3, Seer::filterEscapes(msg_text)); } } }else if (text.startsWith("^error,msg=\"No registers.\"")) { variablesTreeWidget->clear(); }else{ // Ignore others. } // Resize columns. variablesTreeWidget->resizeColumnToContents(0); variablesTreeWidget->resizeColumnToContents(1); variablesTreeWidget->resizeColumnToContents(2); variablesTreeWidget->resizeColumnToContents(3); // Scroll to the bottom. QTreeWidgetItem* lastItem = variablesTreeWidget->topLevelItem(variablesTreeWidget->topLevelItemCount()-1); if (lastItem) { variablesTreeWidget->scrollToItem(lastItem); } // Set the cursor back. QApplication::restoreOverrideCursor(); } void SeerVariableLoggerBrowserWidget::handleEvaluateVariableExpression (int expressionid, QString expression) { QString id_text = QString::number(expressionid); if (_ids.contains(id_text.toInt()) == false) { return; } QList matches = variablesTreeWidget->findItems(id_text, Qt::MatchExactly, 0); // Reuse existing item. if (matches.size() > 0) { matches.first()->setText(1, QTime::currentTime().toString(Qt::TextDate)); matches.first()->setText(2, ""); matches.first()->setText(3, ""); // Add new item. }else{ QTreeWidgetItem* item = new QTreeWidgetItem; item->setText(0, id_text); item->setText(1, QTime::currentTime().toString(Qt::TextDate)); item->setText(2, expression); item->setText(3, ""); item->setFont(3, QFontDatabase::systemFont(QFontDatabase::FixedFont)); variablesTreeWidget->addTopLevelItem(item); } // Resize columns done later in handleText(). } void SeerVariableLoggerBrowserWidget::addVariableExpression (QString expression) { //qDebug(); if (expression != "") { int id = Seer::createID(); _ids.insert(id); // Keep track of which ones are entered. emit evaluateVariableExpression(id, expression); } } void SeerVariableLoggerBrowserWidget::handleAddLineEdit () { //qDebug(); QString variable = variableAddLineEdit->text(); variableAddLineEdit->clear(); if (variable != "") { int id = Seer::createID(); _ids.insert(id); // Keep track of which ones are entered. emit evaluateVariableExpression(id, variable); } } void SeerVariableLoggerBrowserWidget::handleDeleteToolButton () { // Get selected tree items. QList items = variablesTreeWidget->selectedItems(); // Remove them. for(int i=0; iresizeColumnToContents(0); variablesTreeWidget->resizeColumnToContents(1); variablesTreeWidget->resizeColumnToContents(2); variablesTreeWidget->resizeColumnToContents(3); } void SeerVariableLoggerBrowserWidget::handleDeleteAllToolButton () { // Remove all. variablesTreeWidget->clear(); // Resize columns. variablesTreeWidget->resizeColumnToContents(0); variablesTreeWidget->resizeColumnToContents(1); variablesTreeWidget->resizeColumnToContents(2); variablesTreeWidget->resizeColumnToContents(3); } void SeerVariableLoggerBrowserWidget::handleItemEntered (QTreeWidgetItem* item, int column) { Q_UNUSED(column); //qDebug() << item->text(0) << column; item->setToolTip(0, item->text(1) + " : " + item->text(2) + " : " + item->text(3)); for (int i=1; icolumnCount(); i++) { // Copy tooltip to other columns. item->setToolTip(i, item->toolTip(0)); } } void SeerVariableLoggerBrowserWidget::handleContextMenu (const QPoint& pos) { // Get the item at the cursor. QTreeWidgetItem* item = variablesTreeWidget->itemAt(pos); // Construct the menu. QMenu* menu = new QMenu("Options", this); QAction* copyAction = menu->addAction("Copy selected"); QAction* copyAllAction = menu->addAction("Copy all"); // If no selected item, disable 'selected' copy but allow 'all'. if (item == 0) { copyAction->setEnabled(false); } // Execute the menu. Return if nothing. QAction* action = menu->exec(variablesTreeWidget->mapToGlobal(pos)); if (action == 0) { return; } // Get selected tree items. QList items; // Get list of 'select' items. if (action == copyAction) { items = variablesTreeWidget->selectedItems(); } // Get list of 'all' items. if (action == copyAllAction) { items = variablesTreeWidget->findItems(QString("*"), Qt::MatchWrap | Qt::MatchWildcard); } // Populate the clipboard. if (items.size() == 0) { return; } QClipboard* clipboard = QGuiApplication::clipboard(); QString text; for (int i=0; itext(2) + ":" + items[i]->text(3); } clipboard->setText(text, QClipboard::Clipboard); clipboard->setText(text, QClipboard::Selection); }