Files
seer/src/SeerVariableLoggerBrowserWidget.cpp
T

273 lines
8.7 KiB
C++
Raw Normal View History

2021-09-01 14:01:00 -05:00
#include "SeerVariableLoggerBrowserWidget.h"
#include "SeerUtl.h"
#include <QtWidgets/QTreeWidget>
#include <QtWidgets/QTreeWidgetItemIterator>
#include <QtWidgets/QApplication>
2023-10-15 12:33:43 -05:00
#include <QtWidgets/QMenu>
2023-10-15 10:19:10 -05:00
#include <QtGui/QFontDatabase>
2023-10-15 12:33:43 -05:00
#include <QtGui/QClipboard>
2021-09-01 14:01:00 -05:00
#include <QtCore/QTime>
#include <QtCore/QDebug>
2023-10-15 12:33:43 -05:00
#include <QAction>
2021-09-01 14:01:00 -05:00
SeerVariableLoggerBrowserWidget::SeerVariableLoggerBrowserWidget (QWidget* parent) : QWidget(parent) {
// Construct the UI.
setupUi(this);
// Setup the widgets
2021-10-10 12:57:30 -05:00
variablesTreeWidget->setMouseTracking(true);
2021-09-01 14:01:00 -05:00
variablesTreeWidget->setSortingEnabled(false);
2023-10-15 12:33:43 -05:00
variablesTreeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
2021-09-01 14:01:00 -05:00
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.
2021-09-01 14:01:00 -05:00
variablesTreeWidget->clear();
// Connect things.
2021-10-10 12:57:30 -05:00
QObject::connect(this, &SeerVariableLoggerBrowserWidget::evaluateVariableExpression, this, &SeerVariableLoggerBrowserWidget::handleEvaluateVariableExpression);
2022-08-10 20:17:07 -05:00
QObject::connect(variableAddLineEdit, &QLineEdit::returnPressed, this, &SeerVariableLoggerBrowserWidget::handleAddLineEdit);
2021-10-10 12:57:30 -05:00
QObject::connect(variableDeleteToolButton, &QToolButton::clicked, this, &SeerVariableLoggerBrowserWidget::handleDeleteToolButton);
QObject::connect(variableDeleteAllToolButton, &QToolButton::clicked, this, &SeerVariableLoggerBrowserWidget::handleDeleteAllToolButton);
QObject::connect(variablesTreeWidget, &QTreeWidget::itemEntered, this, &SeerVariableLoggerBrowserWidget::handleItemEntered);
2023-10-15 12:33:43 -05:00
QObject::connect(variablesTreeWidget, &QTreeWidget::customContextMenuRequested, this, &SeerVariableLoggerBrowserWidget::handleContextMenu);
2021-09-01 14:01:00 -05:00
}
SeerVariableLoggerBrowserWidget::~SeerVariableLoggerBrowserWidget () {
}
void SeerVariableLoggerBrowserWidget::handleText (const QString& text) {
QApplication::setOverrideCursor(Qt::BusyCursor);
if (text.contains(QRegularExpression("^([0-9]+)\\^done,value="))) {
2021-09-01 14:01:00 -05:00
//qDebug() << text;
2021-09-01 14:01:00 -05:00
// "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) {
2021-09-01 14:01:00 -05:00
QList<QTreeWidgetItem*> matches = variablesTreeWidget->findItems(id_text, Qt::MatchExactly, 0);
if (matches.size() > 0) {
matches.first()->setText(3, Seer::filterEscapes(value_text));
}
2021-09-01 14:01:00 -05:00
}
}else if (text.contains(QRegularExpression("^([0-9]+)\\^error,msg="))) {
2021-09-01 14:01:00 -05:00
//qDebug() << text;
2021-09-01 14:01:00 -05:00
// "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<QTreeWidgetItem*> matches = variablesTreeWidget->findItems(id_text, Qt::MatchExactly, 0);
2021-09-01 14:01:00 -05:00
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));
}
2021-09-01 14:01:00 -05:00
}
}else if (text.startsWith("^error,msg=\"No registers.\"")) {
2021-09-01 14:01:00 -05:00
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;
}
2021-09-01 14:01:00 -05:00
QList<QTreeWidgetItem*> 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, "");
2023-10-15 10:19:10 -05:00
item->setFont(3, QFontDatabase::systemFont(QFontDatabase::FixedFont));
2021-09-01 14:01:00 -05:00
variablesTreeWidget->addTopLevelItem(item);
}
// Resize columns done later in handleText().
2021-09-01 14:01:00 -05:00
}
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);
}
}
2021-09-01 14:01:00 -05:00
void SeerVariableLoggerBrowserWidget::handleAddLineEdit () {
//qDebug();
2021-09-01 14:01:00 -05:00
QString variable = variableAddLineEdit->text();
variableAddLineEdit->clear();
if (variable != "") {
int id = Seer::createID();
_ids.insert(id); // Keep track of which ones are entered.
2021-09-01 14:01:00 -05:00
emit evaluateVariableExpression(id, variable);
}
}
void SeerVariableLoggerBrowserWidget::handleDeleteToolButton () {
// Get selected tree items.
QList<QTreeWidgetItem*> items = variablesTreeWidget->selectedItems();
// Remove them.
for(int i=0; i<items.size(); i++){
delete items[i];
}
// Resize columns.
variablesTreeWidget->resizeColumnToContents(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);
}
2021-10-10 12:57:30 -05:00
void SeerVariableLoggerBrowserWidget::handleItemEntered (QTreeWidgetItem* item, int column) {
2022-04-28 20:20:37 -05:00
Q_UNUSED(column);
//qDebug() << item->text(0) << column;
2021-10-10 12:57:30 -05:00
item->setToolTip(0, item->text(1) + " : " + item->text(2) + " : " + item->text(3));
for (int i=1; i<variablesTreeWidget->columnCount(); i++) { // Copy tooltip to other columns.
item->setToolTip(i, item->toolTip(0));
}
}
2023-10-15 12:33:43 -05:00
void SeerVariableLoggerBrowserWidget::handleContextMenu (const QPoint& pos) {
// Get the item at the cursor.
QTreeWidgetItem* item = variablesTreeWidget->itemAt(pos);
// Construct the menu.
QMenu* clipboardMenu = new QMenu("Clipboard");
QAction* copyAction = clipboardMenu->addAction("Copy selected");
QAction* copyAllAction = clipboardMenu->addAction("Copy all");
QMenu* menu = new QMenu(this);
menu->addMenu(clipboardMenu);
// 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<QTreeWidgetItem*> 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; i<items.size(); i++){
if (i != 0) {
text += '\n';
}
text += items[i]->text(2) + ":" + items[i]->text(3);
}
clipboard->setText(text, QClipboard::Clipboard);
clipboard->setText(text, QClipboard::Selection);
}