Introduce QMessageBox that asks the user to save a changed TraceFile
The TraceAnalyzer now asks the user to save the changed TraceFile (eg. modified comments, etc.) when closing the tab.
This commit is contained in:
@@ -54,6 +54,9 @@ TraceNavigator::TraceNavigator(QString path, CommentModel *commentModel, QObject
|
||||
navigateToTime(commentModel->getTimeFromIndex(index));
|
||||
});
|
||||
|
||||
QObject::connect(commentModel, &CommentModel::dataChanged, this, &TraceNavigator::traceFileModified);
|
||||
QObject::connect(commentModel, &CommentModel::rowsRemoved, this, &TraceNavigator::traceFileModified);
|
||||
|
||||
tracePlotLineCache =
|
||||
std::make_shared<TracePlotLineCache>(getTracePlotLines(), GeneralTraceInfo().numberOfRanks,
|
||||
GeneralTraceInfo().groupsPerRank, GeneralTraceInfo().banksPerGroup);
|
||||
@@ -317,3 +320,13 @@ const CommentModel *TraceNavigator::getCommentModel() const
|
||||
{
|
||||
return commentModel;
|
||||
}
|
||||
|
||||
bool TraceNavigator::existChangesToCommit() const
|
||||
{
|
||||
return changesToCommitExist;
|
||||
}
|
||||
|
||||
void TraceNavigator::traceFileModified()
|
||||
{
|
||||
changesToCommitExist = true;
|
||||
}
|
||||
|
||||
@@ -118,10 +118,15 @@ public:
|
||||
|
||||
const CommentModel *getCommentModel() const;
|
||||
|
||||
bool existChangesToCommit() const;
|
||||
|
||||
Q_SIGNALS:
|
||||
void currentTraceTimeChanged();
|
||||
void selectedTransactionsChanged();
|
||||
|
||||
public Q_SLOTS:
|
||||
void traceFileModified();
|
||||
|
||||
private:
|
||||
TraceDB traceFile;
|
||||
|
||||
|
||||
@@ -37,12 +37,13 @@
|
||||
*/
|
||||
|
||||
#include "traceanalyzer.h"
|
||||
#include "ui_traceanalyzer.h"
|
||||
#include "QMessageBox"
|
||||
#include "tracefiletab.h"
|
||||
#include "ui_traceanalyzer.h"
|
||||
#include <QCloseEvent>
|
||||
#include <QDateTime>
|
||||
#include <QFileDialog>
|
||||
#include <QFileInfo>
|
||||
#include <QDateTime>
|
||||
#include "QMessageBox"
|
||||
#include <iostream>
|
||||
|
||||
void TraceAnalyzer::setUpStatusBar()
|
||||
@@ -137,15 +138,21 @@ void TraceAnalyzer::on_traceFileTabs_tabCloseRequested(int index)
|
||||
{
|
||||
TraceFileTab *traceFileTab = static_cast<TraceFileTab *>
|
||||
(ui->traceFileTabs->widget(index));
|
||||
openedTraceFiles.remove(traceFileTab->getPathToTraceFile());
|
||||
ui->traceFileTabs->removeTab(index);
|
||||
delete traceFileTab;
|
||||
|
||||
if (traceFileTab->close())
|
||||
{
|
||||
openedTraceFiles.remove(traceFileTab->getPathToTraceFile());
|
||||
ui->traceFileTabs->removeTab(index);
|
||||
delete traceFileTab;
|
||||
}
|
||||
}
|
||||
|
||||
void TraceAnalyzer::on_actionClose_all_triggered()
|
||||
{
|
||||
while (ui->traceFileTabs->count())
|
||||
on_traceFileTabs_tabCloseRequested(0);
|
||||
for (unsigned int i = ui->traceFileTabs->count(); i--;)
|
||||
{
|
||||
on_traceFileTabs_tabCloseRequested(i);
|
||||
}
|
||||
|
||||
// All files closed. Disable actions except for "Open".
|
||||
ui->actionReload_all->setEnabled(false);
|
||||
@@ -163,23 +170,24 @@ void TraceAnalyzer::on_actionReload_all_triggered()
|
||||
TraceFileTab *traceFileTab;
|
||||
|
||||
// Remove all tabs
|
||||
int tabIndex = 0;
|
||||
while (ui->traceFileTabs->count() != 0) {
|
||||
for (unsigned int i = ui->traceFileTabs->count(); i--;)
|
||||
{
|
||||
traceFileTab = static_cast<TraceFileTab *>(ui->traceFileTabs->widget(0));
|
||||
std::cout << "Closing tab #" << tabIndex << " \"" <<
|
||||
traceFileTab->getPathToTraceFile().toStdString() << "\"" << std::endl;
|
||||
std::cout << "Closing tab #" << i << " \"" << traceFileTab->getPathToTraceFile().toStdString() << "\""
|
||||
<< std::endl;
|
||||
|
||||
if (!traceFileTab->close())
|
||||
return;
|
||||
|
||||
ui->traceFileTabs->removeTab(0);
|
||||
delete traceFileTab;
|
||||
|
||||
tabIndex++;
|
||||
}
|
||||
|
||||
QList<QString> list = openedTraceFiles.toList();
|
||||
qSort(list);
|
||||
|
||||
// Recreate all tabs
|
||||
tabIndex = 0;
|
||||
int tabIndex = 0;
|
||||
for (auto path : list) {
|
||||
std::cout << "Reopening tab# " << tabIndex << " \"" << path.toStdString() <<
|
||||
"\"" << std::endl;
|
||||
@@ -231,3 +239,18 @@ void TraceAnalyzer::on_actionMetrics_triggered()
|
||||
evaluationTool.activateWindow();
|
||||
evaluationTool.showAndEvaluateMetrics(openedTraceFiles.toList());
|
||||
}
|
||||
|
||||
void TraceAnalyzer::closeEvent(QCloseEvent *event)
|
||||
{
|
||||
for (unsigned int i = 0; i < ui->traceFileTabs->count(); i++)
|
||||
{
|
||||
QWidget *tab = ui->traceFileTabs->widget(i);
|
||||
if (!tab->close())
|
||||
{
|
||||
event->ignore();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
event->accept();
|
||||
}
|
||||
|
||||
@@ -67,6 +67,9 @@ public:
|
||||
void setUpStatusBar();
|
||||
void setUpGui();
|
||||
|
||||
protected:
|
||||
void closeEvent(QCloseEvent *event) override;
|
||||
|
||||
private:
|
||||
void openTracefile(const QString &path);
|
||||
QLabel *statusLabel;
|
||||
|
||||
@@ -37,38 +37,37 @@
|
||||
*/
|
||||
|
||||
#include "tracefiletab.h"
|
||||
#include "ui_tracefiletab.h"
|
||||
#include "queryeditor.h"
|
||||
#include "QFileInfo"
|
||||
#include "qmessagebox.h"
|
||||
#include "businessObjects/commentmodel.h"
|
||||
#include "businessObjects/configmodels.h"
|
||||
#include "businessObjects/pythoncaller.h"
|
||||
#include <iostream>
|
||||
#include <QStandardItemModel>
|
||||
#include <QString>
|
||||
#include <QItemDelegate>
|
||||
#include <QFileDialog>
|
||||
#include <QtConcurrent/QtConcurrent>
|
||||
#include <QTextStream>
|
||||
#include <QDebug>
|
||||
#include "qwt_plot_histogram.h"
|
||||
#include "qwt_plot_curve.h"
|
||||
#include "qwt_plot_layout.h"
|
||||
#include "qwt_scale_draw.h"
|
||||
#include "qwt_scale_widget.h"
|
||||
#include "presentation/traceselector.h"
|
||||
#include "qmessagebox.h"
|
||||
#include "queryeditor.h"
|
||||
#include "qwt_legend.h"
|
||||
#include "qwt_plot_curve.h"
|
||||
#include "qwt_plot_histogram.h"
|
||||
#include "qwt_plot_layout.h"
|
||||
#include "qwt_plot_magnifier.h"
|
||||
#include "qwt_plot_panner.h"
|
||||
#include "presentation/traceselector.h"
|
||||
#include "businessObjects/configmodels.h"
|
||||
#include "businessObjects/commentmodel.h"
|
||||
#include "qwt_scale_draw.h"
|
||||
#include "qwt_scale_widget.h"
|
||||
#include "ui_tracefiletab.h"
|
||||
#include <QDebug>
|
||||
#include <QFileDialog>
|
||||
#include <QItemDelegate>
|
||||
#include <QMessageBox>
|
||||
#include <QStandardItemModel>
|
||||
#include <QString>
|
||||
#include <QTextStream>
|
||||
#include <QtConcurrent/QtConcurrent>
|
||||
#include <iostream>
|
||||
|
||||
#include <math.h>
|
||||
|
||||
TraceFileTab::TraceFileTab(QWidget *parent, const QString &path) :
|
||||
QWidget(parent), ui(new Ui::TraceFileTab), navigator(new TraceNavigator(path, this)),
|
||||
mcConfigModel(new McConfigModel(navigator->TraceFile(), this)),
|
||||
memSpecModel(new MemSpecModel(navigator->TraceFile(), this)),
|
||||
commentModel(new CommentModel(this)), savingChangesToDB(false)
|
||||
TraceFileTab::TraceFileTab(QWidget *parent, const QString &path)
|
||||
: QWidget(parent), ui(new Ui::TraceFileTab), commentModel(new CommentModel(this)),
|
||||
navigator(new TraceNavigator(path, commentModel, this)),
|
||||
mcConfigModel(new McConfigModel(navigator->TraceFile(), this)),
|
||||
memSpecModel(new MemSpecModel(navigator->TraceFile(), this)), savingChangesToDB(false)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
this->path = path;
|
||||
@@ -199,6 +198,37 @@ void TraceFileTab::tracefileChanged()
|
||||
navigator->refreshData();
|
||||
}
|
||||
|
||||
void TraceFileTab::closeEvent(QCloseEvent *event)
|
||||
{
|
||||
if (navigator->existChangesToCommit())
|
||||
{
|
||||
QMessageBox saveDialog;
|
||||
saveDialog.setWindowTitle(QFileInfo(path).baseName());
|
||||
saveDialog.setText("The trace file has been modified.");
|
||||
saveDialog.setInformativeText("Do you want to save your changes?<br><b>Unsaved changes will be lost.</b>");
|
||||
saveDialog.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
|
||||
saveDialog.setDefaultButton(QMessageBox::Save);
|
||||
saveDialog.setIcon(QMessageBox::Warning);
|
||||
int returnCode = saveDialog.exec();
|
||||
|
||||
switch (returnCode)
|
||||
{
|
||||
case QMessageBox::Cancel:
|
||||
event->ignore();
|
||||
break;
|
||||
case QMessageBox::Discard:
|
||||
event->accept();
|
||||
break;
|
||||
case QMessageBox::Save:
|
||||
commitChangesToDB();
|
||||
event->accept();
|
||||
break;
|
||||
};
|
||||
}
|
||||
else
|
||||
event->accept();
|
||||
}
|
||||
|
||||
class ItemDelegate: public QItemDelegate
|
||||
{
|
||||
public:
|
||||
|
||||
@@ -73,15 +73,19 @@ public:
|
||||
void commitChangesToDB(void);
|
||||
void exportAsVCD();
|
||||
|
||||
protected:
|
||||
void closeEvent(QCloseEvent *event) override;
|
||||
|
||||
private:
|
||||
QString path;
|
||||
Ui::TraceFileTab *ui;
|
||||
TraceNavigator *navigator;
|
||||
QFileSystemWatcher *fileWatcher;
|
||||
|
||||
CommentModel *commentModel;
|
||||
TraceNavigator *navigator;
|
||||
|
||||
QAbstractItemModel *mcConfigModel;
|
||||
QAbstractItemModel *memSpecModel;
|
||||
CommentModel *commentModel;
|
||||
|
||||
void setUpQueryEditor(QString path);
|
||||
bool savingChangesToDB;
|
||||
|
||||
Reference in New Issue
Block a user