From 81dedb65970fc19d6df4367e4cf50bac469cee0a Mon Sep 17 00:00:00 2001 From: Derek Christ Date: Mon, 20 Sep 2021 11:41:11 +0200 Subject: [PATCH 1/4] Improve file menu of TraceAnalyzer. --- DRAMSys/traceAnalyzer/traceanalyzer.cpp | 47 +++++++- DRAMSys/traceAnalyzer/traceanalyzer.h | 8 +- DRAMSys/traceAnalyzer/traceanalyzer.ui | 142 ++++++++++++++++++------ 3 files changed, 155 insertions(+), 42 deletions(-) diff --git a/DRAMSys/traceAnalyzer/traceanalyzer.cpp b/DRAMSys/traceAnalyzer/traceanalyzer.cpp index dce1bbc3..fab2cb0e 100644 --- a/DRAMSys/traceAnalyzer/traceanalyzer.cpp +++ b/DRAMSys/traceAnalyzer/traceanalyzer.cpp @@ -119,16 +119,21 @@ void TraceAnalyzer::openTracefile(const QString &path) void TraceAnalyzer::on_menuFile_aboutToShow() { ui->actionOpen->setEnabled(true); + ui->actionQuit->setEnabled(true); bool tabsOpen = ui->traceFileTabs->count() > 0; bool exportAsVcdAvailable = PythonCaller::instance().vcdExportDependenciesAvailable(); + ui->actionSave->setEnabled(tabsOpen); + ui->actionSave_as->setEnabled(tabsOpen); + ui->actionSave_all->setEnabled(tabsOpen); + ui->actionReload->setEnabled(tabsOpen); ui->actionReload_all->setEnabled(tabsOpen); - ui->actionSaveChangesToDB->setEnabled(tabsOpen); ui->actionExportAsVCD->setEnabled(tabsOpen && exportAsVcdAvailable); - ui->actionClose_all->setEnabled(tabsOpen); ui->actionTest->setEnabled(tabsOpen); ui->actionMetrics->setEnabled(tabsOpen); + ui->actionClose->setEnabled(tabsOpen); + ui->actionClose_all->setEnabled(tabsOpen); } void TraceAnalyzer::on_traceFileTabs_tabCloseRequested(int index) @@ -144,6 +149,11 @@ void TraceAnalyzer::on_traceFileTabs_tabCloseRequested(int index) } } +void TraceAnalyzer::on_actionClose_triggered() +{ + on_traceFileTabs_tabCloseRequested(ui->traceFileTabs->currentIndex()); +} + void TraceAnalyzer::on_actionClose_all_triggered() { for (unsigned int i = ui->traceFileTabs->count(); i--;) @@ -154,6 +164,22 @@ void TraceAnalyzer::on_actionClose_all_triggered() statusLabel->clear(); } +void TraceAnalyzer::on_actionReload_triggered() +{ + auto traceFileTab = static_cast(ui->traceFileTabs->currentWidget()); + + QString traceFile = traceFileTab->getPathToTraceFile(); + + if (!traceFileTab->close()) + return; + + ui->traceFileTabs->removeTab(ui->traceFileTabs->currentIndex()); + openedTraceFiles.remove(traceFile); + delete traceFileTab; + + openTracefile(traceFile); +} + void TraceAnalyzer::on_actionReload_all_triggered() { TraceFileTab *traceFileTab; @@ -192,7 +218,20 @@ void TraceAnalyzer::on_actionReload_all_triggered() this->statusChanged(QString("All databases reloaded "), true); } -void TraceAnalyzer::on_actionSaveChangesToDB_triggered() +void TraceAnalyzer::on_actionSave_triggered() +{ + auto traceFileTab = static_cast(ui->traceFileTabs->currentWidget()); + traceFileTab->commitChangesToDB(); + + // TODO update status +} + +void TraceAnalyzer::on_actionSave_as_triggered() +{ + // TODO +} + +void TraceAnalyzer::on_actionSave_all_triggered() { for (int index = 0; index < ui->traceFileTabs->count(); index++) { // Changes in the database files will trigger the file watchers from @@ -212,7 +251,7 @@ void TraceAnalyzer::on_actionExportAsVCD_triggered() void TraceAnalyzer::statusChanged(QString message, bool saveChangesEnable) { statusLabel->setText(message + QTime::currentTime().toString()); - ui->actionSaveChangesToDB->setEnabled(saveChangesEnable); + ui->actionSave->setEnabled(saveChangesEnable); } void TraceAnalyzer::on_actionTest_triggered() diff --git a/DRAMSys/traceAnalyzer/traceanalyzer.h b/DRAMSys/traceAnalyzer/traceanalyzer.h index e6916862..cbde695e 100644 --- a/DRAMSys/traceAnalyzer/traceanalyzer.h +++ b/DRAMSys/traceAnalyzer/traceanalyzer.h @@ -80,12 +80,16 @@ private Q_SLOTS: void on_traceFileTabs_tabCloseRequested(int index); void on_actionOpen_triggered(); + void on_actionSave_triggered(); + void on_actionSave_as_triggered(); + void on_actionSave_all_triggered(); + void on_actionReload_triggered(); void on_actionReload_all_triggered(); - void on_actionSaveChangesToDB_triggered(); void on_actionExportAsVCD_triggered(); - void on_actionClose_all_triggered(); void on_actionTest_triggered(); void on_actionMetrics_triggered(); + void on_actionClose_triggered(); + void on_actionClose_all_triggered(); public Q_SLOTS: void statusChanged(QString message, bool saveChangesEnable = false); diff --git a/DRAMSys/traceAnalyzer/traceanalyzer.ui b/DRAMSys/traceAnalyzer/traceanalyzer.ui index 6a364223..f3abcd8c 100644 --- a/DRAMSys/traceAnalyzer/traceanalyzer.ui +++ b/DRAMSys/traceAnalyzer/traceanalyzer.ui @@ -54,20 +54,28 @@ - File + &File + + + + - + - + + + + + - Help + &Help @@ -77,54 +85,54 @@ + + + ../../../../.designer/backup../../../../.designer/backup + - Open + &Open... Ctrl+O - - - false + + + + ../../../../.designer/backup../../../../.designer/backup - Reload databases + &Reload - Ctrl+R + F5 - - - false + + + + ../../../../.designer/backup../../../../.designer/backup - Save changes to DB + &Save Ctrl+S - - false - - Close all - - - Ctrl+Q + C&lose all - Info + &Info - About + &About @@ -136,39 +144,101 @@ - - false - - Test + &Test Ctrl+T - - false - - Metrics + &Metrics Ctrl+M - - false + + + ../../../../.designer/backup../../../../.designer/backup - Export as VCD + Export as &VCD... - Ctrl+E + Ctrl+V + + + + + + ../../../../.designer/backup../../../../.designer/backup + + + &Close + + + Ctrl+W + + + + + R&eload all + + + + + + ../../../../.designer/backup../../../../.designer/backup + + + &Quit + + + Ctrl+Q + + + + + + .. + + + Save &all + + + + + + .. + + + Save &as... + + + Ctrl+Shift+S - + + + actionQuit + triggered() + TraceAnalyzer + close() + + + -1 + -1 + + + 399 + 299 + + + + From 4a7efa977a752b14c47f722d8193ded4fff1b204 Mon Sep 17 00:00:00 2001 From: Derek Christ Date: Mon, 20 Sep 2021 17:20:02 +0200 Subject: [PATCH 2/4] Save current tracetime and zoomlevel when reloading tabs. --- .../traceAnalyzer/presentation/traceplot.cpp | 5 + .../traceAnalyzer/presentation/traceplot.h | 15 +-- .../presentation/tracescroller.cpp | 1 - DRAMSys/traceAnalyzer/traceanalyzer.cpp | 112 ++++++++---------- DRAMSys/traceAnalyzer/traceanalyzer.h | 12 +- DRAMSys/traceAnalyzer/traceanalyzer.ui | 3 +- DRAMSys/traceAnalyzer/tracefiletab.cpp | 29 ++++- DRAMSys/traceAnalyzer/tracefiletab.h | 8 +- 8 files changed, 104 insertions(+), 81 deletions(-) diff --git a/DRAMSys/traceAnalyzer/presentation/traceplot.cpp b/DRAMSys/traceAnalyzer/presentation/traceplot.cpp index c7bde09a..65359f8f 100644 --- a/DRAMSys/traceAnalyzer/presentation/traceplot.cpp +++ b/DRAMSys/traceAnalyzer/presentation/traceplot.cpp @@ -416,6 +416,11 @@ void TracePlot::zoomOut(traceTime zoomCenter) (GetCurrentTimespan().Middle() - zoomCenter) / zoomFactor)); } +traceTime TracePlot::ZoomLevel() const +{ + return zoomLevel; +} + void TracePlot::setZoomLevel(traceTime newZoomLevel) { zoomLevel = newZoomLevel; diff --git a/DRAMSys/traceAnalyzer/presentation/traceplot.h b/DRAMSys/traceAnalyzer/presentation/traceplot.h index bea93693..5fff9b23 100644 --- a/DRAMSys/traceAnalyzer/presentation/traceplot.h +++ b/DRAMSys/traceAnalyzer/presentation/traceplot.h @@ -74,17 +74,13 @@ public: TracePlot(QWidget *parent = NULL); void init(TraceNavigator *navigator, QScrollBar *scrollBar, CommentModel *commentModel); Timespan GetCurrentTimespan(); - traceTime ZoomLevel() const - { - return zoomLevel; - } - void setUpActions(); - - void setUpContextMenu(); + traceTime ZoomLevel() const; + void setZoomLevel(traceTime newZoomLevel); CustomLabelScaleDraw *getCustomLabelScaleDraw() const; const TraceDrawingProperties &getDrawingProperties() const; + public Q_SLOTS: void currentTraceTimeChanged(); void selectedTransactionsChanged(); @@ -98,7 +94,6 @@ Q_SIGNALS: void tracePlotZoomChanged(); void tracePlotLinesChanged(); void colorGroupingChanged(ColorGrouping colorgrouping); - // void editComment private Q_SLOTS: void on_executeQuery(); @@ -139,6 +134,9 @@ private: void setUpAxis(); void setUpZoom(); void setUpQueryEditor(); + void setUpActions(); + void setUpContextMenu(); + void connectNavigatorQ_SIGNALS(); void getAndDrawComments(); @@ -156,7 +154,6 @@ private: constexpr static double zoomFactor = 0.8; void zoomIn(traceTime zoomCenter); void zoomOut(traceTime zoomCenter); - void setZoomLevel(traceTime newZoomLevel); void exitZoomMode(); void enterZoomMode(); diff --git a/DRAMSys/traceAnalyzer/presentation/tracescroller.cpp b/DRAMSys/traceAnalyzer/presentation/tracescroller.cpp index 70737a8b..564df655 100644 --- a/DRAMSys/traceAnalyzer/presentation/tracescroller.cpp +++ b/DRAMSys/traceAnalyzer/presentation/tracescroller.cpp @@ -174,7 +174,6 @@ void TraceScroller::getAndDrawComments() } } - /* Q_SLOTS * * diff --git a/DRAMSys/traceAnalyzer/traceanalyzer.cpp b/DRAMSys/traceAnalyzer/traceanalyzer.cpp index fab2cb0e..f3142fa1 100644 --- a/DRAMSys/traceAnalyzer/traceanalyzer.cpp +++ b/DRAMSys/traceAnalyzer/traceanalyzer.cpp @@ -75,11 +75,10 @@ TraceAnalyzer::TraceAnalyzer(QSet paths, StartupOption option, setUpGui(); for (const QString &path : paths) - openTracefile(path); + openTracefileTab(path); - if (option == StartupOption::runTests) { + if (option == StartupOption::runTests) ui->actionTest->trigger(); - } } TraceAnalyzer::~TraceAnalyzer() @@ -93,24 +92,30 @@ void TraceAnalyzer::on_actionOpen_triggered() tr("Open Tracefile"), "../simulator/", tr("Tracefile (*.tdb)")); - if (paths.isEmpty()) { + if (paths.isEmpty()) return; - } - for (const QString &path : paths) { - openTracefile(path); - } + for (const QString &path : paths) + openTracefileTab(path); } -void TraceAnalyzer::openTracefile(const QString &path) +TraceFileTab *TraceAnalyzer::createTraceFileTab(const QString &path) +{ + TraceFileTab *traceFileTab = new TraceFileTab(this, path); + + connect(traceFileTab, &TraceFileTab::statusChanged, this, &TraceAnalyzer::statusChanged); + + return traceFileTab; +} + +void TraceAnalyzer::openTracefileTab(const QString &path) { if (openedTraceFiles.contains(path)) return; - TraceFileTab *tab = new TraceFileTab(this, path); - connect(tab, SIGNAL(statusChanged(QString, bool)), this, - SLOT(statusChanged(QString, bool))); - ui->traceFileTabs->addTab(tab, QFileInfo(path).baseName()); + TraceFileTab *traceFileTab = createTraceFileTab(path); + + ui->traceFileTabs->addTab(traceFileTab, QFileInfo(path).baseName()); openedTraceFiles.insert(path); statusLabel->clear(); @@ -125,7 +130,6 @@ void TraceAnalyzer::on_menuFile_aboutToShow() bool exportAsVcdAvailable = PythonCaller::instance().vcdExportDependenciesAvailable(); ui->actionSave->setEnabled(tabsOpen); - ui->actionSave_as->setEnabled(tabsOpen); ui->actionSave_all->setEnabled(tabsOpen); ui->actionReload->setEnabled(tabsOpen); ui->actionReload_all->setEnabled(tabsOpen); @@ -136,7 +140,7 @@ void TraceAnalyzer::on_menuFile_aboutToShow() ui->actionClose_all->setEnabled(tabsOpen); } -void TraceAnalyzer::on_traceFileTabs_tabCloseRequested(int index) +void TraceAnalyzer::closeTab(int index) { TraceFileTab *traceFileTab = static_cast (ui->traceFileTabs->widget(index)); @@ -149,73 +153,63 @@ void TraceAnalyzer::on_traceFileTabs_tabCloseRequested(int index) } } +void TraceAnalyzer::on_traceFileTabs_tabCloseRequested(int index) +{ + closeTab(index); +} + void TraceAnalyzer::on_actionClose_triggered() { - on_traceFileTabs_tabCloseRequested(ui->traceFileTabs->currentIndex()); + closeTab(ui->traceFileTabs->currentIndex()); } void TraceAnalyzer::on_actionClose_all_triggered() { for (unsigned int i = ui->traceFileTabs->count(); i--;) - { - on_traceFileTabs_tabCloseRequested(i); - } + closeTab(i); statusLabel->clear(); } -void TraceAnalyzer::on_actionReload_triggered() +void TraceAnalyzer::reloadTab(int index) { - auto traceFileTab = static_cast(ui->traceFileTabs->currentWidget()); + auto traceFileTab = static_cast(ui->traceFileTabs->widget(index)); QString traceFile = traceFileTab->getPathToTraceFile(); + traceTime time = traceFileTab->getCurrentTraceTime(); + traceTime zoomLevel = traceFileTab->getZoomLevel(); if (!traceFileTab->close()) return; - ui->traceFileTabs->removeTab(ui->traceFileTabs->currentIndex()); - openedTraceFiles.remove(traceFile); + ui->traceFileTabs->removeTab(index); delete traceFileTab; - openTracefile(traceFile); + traceFileTab = createTraceFileTab(traceFile); + traceFileTab->setZoomLevel(zoomLevel); + traceFileTab->navigateToTime(time); + + ui->traceFileTabs->insertTab(index, traceFileTab, QFileInfo(traceFile).baseName()); + ui->traceFileTabs->setCurrentIndex(index); +} + +void TraceAnalyzer::on_actionReload_triggered() +{ + int index = ui->traceFileTabs->currentIndex(); + reloadTab(index); + this->statusChanged(QString("Reloaded tab ") + QString::number(index) + " "); } void TraceAnalyzer::on_actionReload_all_triggered() { - TraceFileTab *traceFileTab; + int index = ui->traceFileTabs->currentIndex(); - // Remove all tabs for (unsigned int i = ui->traceFileTabs->count(); i--;) - { - traceFileTab = static_cast(ui->traceFileTabs->widget(0)); - std::cout << "Closing tab #" << i << " \"" << traceFileTab->getPathToTraceFile().toStdString() << "\"" - << std::endl; + reloadTab(i); - if (!traceFileTab->close()) - return; + ui->traceFileTabs->setCurrentIndex(index); - ui->traceFileTabs->removeTab(0); - delete traceFileTab; - } - - QList list = openedTraceFiles.values(); - std::sort(list.begin(), list.end()); - - // Recreate all tabs - int tabIndex = 0; - for (auto path : list) { - std::cout << "Reopening tab# " << tabIndex << " \"" << path.toStdString() << - "\"" << std::endl; - - traceFileTab = new TraceFileTab(this, path); - connect(traceFileTab, SIGNAL(statusChanged(QString, bool)), this, - SLOT(statusChanged(QString, bool))); - ui->traceFileTabs->addTab(traceFileTab, QFileInfo(path).baseName()); - - tabIndex++; - } - - this->statusChanged(QString("All databases reloaded "), true); + this->statusChanged(QString("All databases reloaded ")); } void TraceAnalyzer::on_actionSave_triggered() @@ -223,12 +217,7 @@ void TraceAnalyzer::on_actionSave_triggered() auto traceFileTab = static_cast(ui->traceFileTabs->currentWidget()); traceFileTab->commitChangesToDB(); - // TODO update status -} - -void TraceAnalyzer::on_actionSave_as_triggered() -{ - // TODO + this->statusChanged(QString("Saved database ") + QFileInfo(traceFileTab->getPathToTraceFile()).baseName() + " "); } void TraceAnalyzer::on_actionSave_all_triggered() @@ -248,10 +237,9 @@ void TraceAnalyzer::on_actionExportAsVCD_triggered() traceFileTab->exportAsVCD(); } -void TraceAnalyzer::statusChanged(QString message, bool saveChangesEnable) +void TraceAnalyzer::statusChanged(const QString &message) { statusLabel->setText(message + QTime::currentTime().toString()); - ui->actionSave->setEnabled(saveChangesEnable); } void TraceAnalyzer::on_actionTest_triggered() diff --git a/DRAMSys/traceAnalyzer/traceanalyzer.h b/DRAMSys/traceAnalyzer/traceanalyzer.h index cbde695e..aba70321 100644 --- a/DRAMSys/traceAnalyzer/traceanalyzer.h +++ b/DRAMSys/traceAnalyzer/traceanalyzer.h @@ -33,6 +33,7 @@ * Janik Schlemminger * Robert Gernhardt * Matthias Jung + * Derek Christ */ #ifndef TRACEANALYZER_H @@ -52,6 +53,8 @@ class TraceAnalyzer; enum class StartupOption {showPlots, runTests}; enum class OpenOptions {files, folders}; +class TraceFileTab; + class TraceAnalyzer : public QMainWindow { Q_OBJECT @@ -71,7 +74,11 @@ protected: void closeEvent(QCloseEvent *event) override; private: - void openTracefile(const QString &path); + TraceFileTab *createTraceFileTab(const QString &path); + void openTracefileTab(const QString &path); + void reloadTab(int index); + void closeTab(int index); + QLabel *statusLabel; QSet openedTraceFiles; @@ -81,7 +88,6 @@ private Q_SLOTS: void on_actionOpen_triggered(); void on_actionSave_triggered(); - void on_actionSave_as_triggered(); void on_actionSave_all_triggered(); void on_actionReload_triggered(); void on_actionReload_all_triggered(); @@ -92,7 +98,7 @@ private Q_SLOTS: void on_actionClose_all_triggered(); public Q_SLOTS: - void statusChanged(QString message, bool saveChangesEnable = false); + void statusChanged(const QString &message); private: Ui::TraceAnalyzer *ui; diff --git a/DRAMSys/traceAnalyzer/traceanalyzer.ui b/DRAMSys/traceAnalyzer/traceanalyzer.ui index f3abcd8c..33621640 100644 --- a/DRAMSys/traceAnalyzer/traceanalyzer.ui +++ b/DRAMSys/traceAnalyzer/traceanalyzer.ui @@ -58,7 +58,6 @@ - @@ -105,7 +104,7 @@ &Reload - F5 + Ctrl+R diff --git a/DRAMSys/traceAnalyzer/tracefiletab.cpp b/DRAMSys/traceAnalyzer/tracefiletab.cpp index 80da307a..4438da91 100644 --- a/DRAMSys/traceAnalyzer/tracefiletab.cpp +++ b/DRAMSys/traceAnalyzer/tracefiletab.cpp @@ -184,14 +184,13 @@ void TraceFileTab::tracefileChanged() // Database has changed due to user action (e.g., saving comments). // No need to disable the "Save changes to DB" menu. savingChangesToDB = false; - Q_EMIT statusChanged(QString("Changes saved "), true); + Q_EMIT statusChanged(QString("Changes saved ")); } else { // External event changed the database file (e.g., the database file // was overwritten when running a new test). // The "Save changes to DB" menu must be disabled to avoid saving // changes to a corrupted or inconsistent file. - Q_EMIT statusChanged(QString("At least one database has changed on disk "), - false); + Q_EMIT statusChanged(QString("At least one database has changed on disk ")); } navigator->refreshData(); } @@ -227,6 +226,30 @@ void TraceFileTab::closeEvent(QCloseEvent *event) event->accept(); } +traceTime TraceFileTab::getCurrentTraceTime() const +{ + return navigator->CurrentTraceTime(); +} + +void TraceFileTab::navigateToTime(traceTime time) +{ + navigator->navigateToTime(time); +} + +traceTime TraceFileTab::getZoomLevel() const +{ + TracePlot *traceplot = static_cast(ui->traceplot); + return traceplot->ZoomLevel(); +} + +void TraceFileTab::setZoomLevel(traceTime zoomLevel) +{ + TracePlot *traceplot = static_cast(ui->traceplot); + TraceScroller *tracescroller = static_cast(ui->traceScroller); + traceplot->setZoomLevel(zoomLevel); + tracescroller->tracePlotZoomChanged(); +} + class ItemDelegate: public QItemDelegate { public: diff --git a/DRAMSys/traceAnalyzer/tracefiletab.h b/DRAMSys/traceAnalyzer/tracefiletab.h index 1962088d..50703b03 100644 --- a/DRAMSys/traceAnalyzer/tracefiletab.h +++ b/DRAMSys/traceAnalyzer/tracefiletab.h @@ -73,6 +73,11 @@ public: void commitChangesToDB(void); void exportAsVCD(); + traceTime getCurrentTraceTime() const; + void navigateToTime(traceTime time); + traceTime getZoomLevel() const; + void setZoomLevel(traceTime zoomLevel); + protected: void closeEvent(QCloseEvent *event) override; @@ -94,8 +99,9 @@ public Q_SLOTS: void tracefileChanged(); Q_SIGNALS: - void statusChanged(QString message, bool saveChangesEnable = false); + void statusChanged(const QString &message); void colorGroupingChanged(ColorGrouping colorgrouping); + private Q_SLOTS: void on_tabWidget_currentChanged(int index); void on_latencyTreeView_doubleClicked(const QModelIndex &index); From 9e4b8a3fea7a00122f3f9f5f6c0a6d94afb126cf Mon Sep 17 00:00:00 2001 From: Derek Christ Date: Tue, 28 Sep 2021 12:10:50 +0200 Subject: [PATCH 3/4] Restore the selected trace rows/lines when reloading a tab --- .../presentation/tracedrawingproperties.cpp | 3 ++ .../presentation/traceselector.cpp | 49 +++++++++++++++++++ .../presentation/traceselector.h | 9 ++++ DRAMSys/traceAnalyzer/traceanalyzer.cpp | 2 + DRAMSys/traceAnalyzer/tracefiletab.cpp | 14 +++++- DRAMSys/traceAnalyzer/tracefiletab.h | 3 ++ 6 files changed, 79 insertions(+), 1 deletion(-) diff --git a/DRAMSys/traceAnalyzer/presentation/tracedrawingproperties.cpp b/DRAMSys/traceAnalyzer/presentation/tracedrawingproperties.cpp index 930f0e87..95c0a4cd 100644 --- a/DRAMSys/traceAnalyzer/presentation/tracedrawingproperties.cpp +++ b/DRAMSys/traceAnalyzer/presentation/tracedrawingproperties.cpp @@ -103,6 +103,9 @@ void TraceDrawingProperties::updateTracePlotLines(QTreeWidget *treeWidget) void TraceDrawingProperties::addRankGroup(unsigned int rank) { + if (rank >= numberOfRanks) + return; + std::shared_ptr firstRankLine; for (unsigned int group = groupsPerRank; group--;) diff --git a/DRAMSys/traceAnalyzer/presentation/traceselector.cpp b/DRAMSys/traceAnalyzer/presentation/traceselector.cpp index 9ca682fb..434f7ac2 100644 --- a/DRAMSys/traceAnalyzer/presentation/traceselector.cpp +++ b/DRAMSys/traceAnalyzer/presentation/traceselector.cpp @@ -124,6 +124,29 @@ void TraceSelectedTree::init(unsigned int groupsPerRank, unsigned int banksPerGr this->banksPerGroup = banksPerGroup; } +std::vector TraceSelectedTree::clonedItems() const +{ + std::vector clonedTopLevelItems; + + for (unsigned int i = 0; i < topLevelItemCount(); i++) + { + clonedTopLevelItems.push_back(topLevelItem(i)->clone()); + } + + return clonedTopLevelItems; +} + +void TraceSelectedTree::setItems(const std::vector &items) +{ + for (unsigned int i = topLevelItemCount(); i--;) + takeTopLevelItem(i); + + for (auto item : items) + addTopLevelItem(item); + + emit itemsChanged(); +} + QMimeData *TraceSelectedTree::mimeData(const QList items) const { QByteArray traceLineData; @@ -346,6 +369,16 @@ void TraceSelector::setUpTreeWidget(QTreeWidget *treeWidget) ); } +std::vector TraceSelector::getTraceSelectorState() const +{ + return selectedTree->clonedItems(); +} + +void TraceSelector::restoreTraceSelectorState(const std::vector &items) +{ + selectedTree->setItems(items); +} + TraceSelectorTreeItem *TraceSelectorTreeItem::createRankParentItem(unsigned int rank,unsigned int groupsPerRank, unsigned int banksPerGroup) { @@ -409,3 +442,19 @@ QString TraceSelectorTreeItem::getLabel(unsigned int rank, unsigned int bankgrou { return "RA" + QString::number(rank) + " BG" + QString::number(bankgroup) + " BA" + QString::number(bank); } + +QTreeWidgetItem *TraceSelectorTreeItem::clone() const +{ + TraceSelectorTreeItem *cloned = new TraceSelectorTreeItem(*this); + + std::vector clonedChildren; + for (unsigned int i = 0; i < childCount(); i++) + { + clonedChildren.push_back(static_cast(child(i)->clone())); + } + + for (auto child : clonedChildren) + cloned->addChild(child); + + return cloned; +} diff --git a/DRAMSys/traceAnalyzer/presentation/traceselector.h b/DRAMSys/traceAnalyzer/presentation/traceselector.h index 7d120da2..6a2a9fd3 100644 --- a/DRAMSys/traceAnalyzer/presentation/traceselector.h +++ b/DRAMSys/traceAnalyzer/presentation/traceselector.h @@ -70,6 +70,9 @@ public: explicit TraceSelectedTree(QWidget *parent = nullptr); void init(unsigned int groupsPerRank, unsigned int banksPerGroup); + std::vector clonedItems() const; + void setItems(const std::vector &items); + Q_SIGNALS: void itemsChanged(); @@ -108,6 +111,9 @@ public: static QString getLabel(unsigned int rank, unsigned int bankgroup, unsigned int bank); const unsigned int rank = 0, bankgroup = 0, bank = 0; + +protected: + QTreeWidgetItem *clone() const override; }; class TraceSelector : public QWidget @@ -118,6 +124,9 @@ public: explicit TraceSelector(QWidget *parent = nullptr); void init(TracePlot *traceplot); + std::vector getTraceSelectorState() const; + void restoreTraceSelectorState(const std::vector &items); + signals: void selectedTreeChanged(QTreeWidget *treeWidget); diff --git a/DRAMSys/traceAnalyzer/traceanalyzer.cpp b/DRAMSys/traceAnalyzer/traceanalyzer.cpp index f3142fa1..d771a4ac 100644 --- a/DRAMSys/traceAnalyzer/traceanalyzer.cpp +++ b/DRAMSys/traceAnalyzer/traceanalyzer.cpp @@ -178,6 +178,7 @@ void TraceAnalyzer::reloadTab(int index) QString traceFile = traceFileTab->getPathToTraceFile(); traceTime time = traceFileTab->getCurrentTraceTime(); traceTime zoomLevel = traceFileTab->getZoomLevel(); + auto treeItems = traceFileTab->saveTraceSelectorState(); if (!traceFileTab->close()) return; @@ -188,6 +189,7 @@ void TraceAnalyzer::reloadTab(int index) traceFileTab = createTraceFileTab(traceFile); traceFileTab->setZoomLevel(zoomLevel); traceFileTab->navigateToTime(time); + traceFileTab->restoreTraceSelectorState(treeItems); ui->traceFileTabs->insertTab(index, traceFileTab, QFileInfo(traceFile).baseName()); ui->traceFileTabs->setCurrentIndex(index); diff --git a/DRAMSys/traceAnalyzer/tracefiletab.cpp b/DRAMSys/traceAnalyzer/tracefiletab.cpp index 4438da91..ee568c33 100644 --- a/DRAMSys/traceAnalyzer/tracefiletab.cpp +++ b/DRAMSys/traceAnalyzer/tracefiletab.cpp @@ -152,7 +152,7 @@ void TraceFileTab::setUpFileWatcher(QString path) void TraceFileTab::setUpTraceSelector() { - TraceSelector *selector = ui->tabCustomizePlot; + TraceSelector *selector = static_cast(ui->tabCustomizePlot); connect(selector, &TraceSelector::selectedTreeChanged, ui->traceplot, &TracePlot::updateTracePlotLines); selector->init(ui->traceplot); @@ -250,6 +250,18 @@ void TraceFileTab::setZoomLevel(traceTime zoomLevel) tracescroller->tracePlotZoomChanged(); } +std::vector TraceFileTab::saveTraceSelectorState() const +{ + TraceSelector *selector = static_cast(ui->tabCustomizePlot); + return selector->getTraceSelectorState(); +} + +void TraceFileTab::restoreTraceSelectorState(const std::vector &items) +{ + TraceSelector *selector = static_cast(ui->tabCustomizePlot); + selector->restoreTraceSelectorState(items); +} + class ItemDelegate: public QItemDelegate { public: diff --git a/DRAMSys/traceAnalyzer/tracefiletab.h b/DRAMSys/traceAnalyzer/tracefiletab.h index 50703b03..aee1acf0 100644 --- a/DRAMSys/traceAnalyzer/tracefiletab.h +++ b/DRAMSys/traceAnalyzer/tracefiletab.h @@ -78,6 +78,9 @@ public: traceTime getZoomLevel() const; void setZoomLevel(traceTime zoomLevel); + std::vector saveTraceSelectorState() const; + void restoreTraceSelectorState(const std::vector &items); + protected: void closeEvent(QCloseEvent *event) override; From a8c2e9393b7292aa78302738b037d53aac0354b8 Mon Sep 17 00:00:00 2001 From: Lukas Steiner Date: Wed, 29 Sep 2021 09:45:27 +0200 Subject: [PATCH 4/4] Add shortcuts for "all" actions. --- DRAMSys/traceAnalyzer/traceanalyzer.ui | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/DRAMSys/traceAnalyzer/traceanalyzer.ui b/DRAMSys/traceAnalyzer/traceanalyzer.ui index 33621640..470140dc 100644 --- a/DRAMSys/traceAnalyzer/traceanalyzer.ui +++ b/DRAMSys/traceAnalyzer/traceanalyzer.ui @@ -123,6 +123,9 @@ C&lose all + + Ctrl+Shift+W + @@ -186,6 +189,9 @@ R&eload all + + Ctrl+Shift+R + @@ -207,6 +213,9 @@ Save &all + + Ctrl+Shift+S + @@ -216,9 +225,6 @@ Save &as... - - Ctrl+Shift+S -