|
1 | 1 | #include "SeerMatrixVisualizerWidget.h"
|
| 2 | +#include "SeerHelpPageDialog.h" |
2 | 3 | #include "SeerUtl.h"
|
3 | 4 | #include <QtWidgets/QMessageBox>
|
4 | 5 | #include <QtWidgets/QFileDialog>
|
|
11 | 12 | #include <QtCore/QSettings>
|
12 | 13 | #include <QtCore/QDebug>
|
13 | 14 | #include <QtGlobal>
|
| 15 | +#include <algorithm> |
| 16 | +#include <cmath> |
14 | 17 |
|
15 | 18 | SeerMatrixVisualizerWidget::SeerMatrixVisualizerWidget (QWidget* parent) : QWidget(parent) {
|
16 | 19 |
|
@@ -38,6 +41,7 @@ SeerMatrixVisualizerWidget::SeerMatrixVisualizerWidget (QWidget* parent) : QWidg
|
38 | 41 |
|
39 | 42 | // Connect things.
|
40 | 43 | QObject::connect(refreshToolButton, &QToolButton::clicked, this, &SeerMatrixVisualizerWidget::handleRefreshButton);
|
| 44 | + QObject::connect(helpToolButton, &QToolButton::clicked, this, &SeerMatrixVisualizerWidget::handleHelpButton); |
41 | 45 | QObject::connect(variableNameLineEdit, &SeerHistoryLineEdit::returnPressed, this, &SeerMatrixVisualizerWidget::handleVariableNameLineEdit);
|
42 | 46 | QObject::connect(variableNameLineEdit, &SeerHistoryLineEdit::editingFinished, this, &SeerMatrixVisualizerWidget::handleVariableNameLineEdit);
|
43 | 47 | QObject::connect(matrixRowsLineEdit, &SeerHistoryLineEdit::returnPressed, this, &SeerMatrixVisualizerWidget::handleRefreshButton);
|
@@ -424,6 +428,14 @@ void SeerMatrixVisualizerWidget::handleRefreshButton () {
|
424 | 428 | emit evaluateMemoryExpression(_memoryId, variableAddressLineEdit->text(), bytes);
|
425 | 429 | }
|
426 | 430 |
|
| 431 | +void SeerMatrixVisualizerWidget::handleHelpButton () { |
| 432 | + |
| 433 | + SeerHelpPageDialog* help = new SeerHelpPageDialog; |
| 434 | + help->loadFile(":/seer/resources/help/MatrixVisualizer.md"); |
| 435 | + help->show(); |
| 436 | + help->raise(); |
| 437 | +} |
| 438 | + |
427 | 439 | void SeerMatrixVisualizerWidget::handleVariableNameLineEdit () {
|
428 | 440 |
|
429 | 441 | setVariableName (variableNameLineEdit->text());
|
@@ -540,7 +552,84 @@ void SeerMatrixVisualizerWidget::handleMatrixDisplayFormatComboBox (int index) {
|
540 | 552 | }
|
541 | 553 |
|
542 | 554 | void SeerMatrixVisualizerWidget::handleDataChanged () {
|
543 |
| - return; // Do nothing for now. |
| 555 | + |
| 556 | + // Update the meta information. |
| 557 | + |
| 558 | + // Clear everything. |
| 559 | + countLineEdit->setText(""); |
| 560 | + rowsLineEdit->setText(""); |
| 561 | + columnsLineEdit->setText(""); |
| 562 | + minimumLineEdit->setText(""); |
| 563 | + maximumLineEdit->setText(""); |
| 564 | + sumLineEdit->setText(""); |
| 565 | + averageLineEdit->setText(""); |
| 566 | + medianLineEdit->setText(""); |
| 567 | + rmsLineEdit->setText(""); |
| 568 | + |
| 569 | + |
| 570 | + // If there's nothing to show, just return. |
| 571 | + if (matrixTableWidget->dataCount() <= 0) { |
| 572 | + return; |
| 573 | + } |
| 574 | + |
| 575 | + if (matrixTableWidget->dataValues().count() <= 0) { |
| 576 | + return; |
| 577 | + } |
| 578 | + |
| 579 | + // Make a copy of the values for us to play with. |
| 580 | + QVector<double> values = matrixTableWidget->dataValues(); |
| 581 | + |
| 582 | + // Fill in counts. |
| 583 | + countLineEdit->setText(QString::number(matrixTableWidget->dataCount())); |
| 584 | + rowsLineEdit->setText(QString::number(matrixTableWidget->dataRows())); |
| 585 | + columnsLineEdit->setText(QString::number(matrixTableWidget->dataColumns())); |
| 586 | + |
| 587 | + // Calculate statistics. |
| 588 | + double val = 0.0; |
| 589 | + double min = 0.0; |
| 590 | + double max = 0.0; |
| 591 | + double sum = 0.0; |
| 592 | + double sum2 = 0.0; |
| 593 | + double avg = 0.0; |
| 594 | + double med = 0.0; |
| 595 | + double rms = 0.0; |
| 596 | + |
| 597 | + for (int i=0; i<values.size(); i++) { |
| 598 | + |
| 599 | + val = values[i]; |
| 600 | + |
| 601 | + min = std::min(min, val); |
| 602 | + max = std::max(max, val); |
| 603 | + sum += val; |
| 604 | + sum2 += std::pow(val, 2); |
| 605 | + } |
| 606 | + |
| 607 | + avg = sum / values.size(); |
| 608 | + rms = std::sqrt(sum2 / values.size()); |
| 609 | + |
| 610 | + // Post them. |
| 611 | + minimumLineEdit->setText(QString::number(min)); |
| 612 | + maximumLineEdit->setText(QString::number(max)); |
| 613 | + sumLineEdit->setText(QString::number(sum)); |
| 614 | + averageLineEdit->setText(QString::number(avg)); |
| 615 | + rmsLineEdit->setText(QString::number(rms)); |
| 616 | + |
| 617 | + // For median, we need to sort the values. So do this last. |
| 618 | + std::sort(values.begin(), values.end()); |
| 619 | + |
| 620 | + // If the number of elements is odd, the median is the middle element |
| 621 | + if (values.size() % 2 != 0) { |
| 622 | + med = values[values.size() / 2]; |
| 623 | + }else{ |
| 624 | + double mid1 = values[values.size() / 2 - 1]; |
| 625 | + double mid2 = values[values.size() / 2]; |
| 626 | + |
| 627 | + med = (mid1 + mid2) / 2.0; |
| 628 | + } |
| 629 | + |
| 630 | + medianLineEdit->setText(QString::number(med)); |
| 631 | + |
| 632 | + return; |
544 | 633 | }
|
545 | 634 |
|
546 | 635 | void SeerMatrixVisualizerWidget::writeSettings() {
|
|
0 commit comments