From ca45b08db5c61e163736906dc4fb2fef9e5ebfcc Mon Sep 17 00:00:00 2001 From: David Borland Date: Wed, 11 Dec 2019 14:17:51 -0500 Subject: [PATCH] Improve performance for updating region table for single region --- MainWindow.cxx | 8 ++++++-- MainWindow.h | 8 +++++--- RegionTable.cxx | 41 ++++++++++++++++++++++++++++++++++++++ RegionTable.h | 5 +++-- VisualizationContainer.cxx | 21 ++++++++++--------- 5 files changed, 65 insertions(+), 18 deletions(-) diff --git a/MainWindow.cxx b/MainWindow.cxx index d1e0f86..775c9d2 100644 --- a/MainWindow.cxx +++ b/MainWindow.cxx @@ -59,11 +59,15 @@ MainWindow::~MainWindow() { qApp->exit(); } -void MainWindow::UpdateRegionTable(RegionCollection* regions) { +void MainWindow::updateRegions(RegionCollection* regions) { regionTable->update(regions); } -void MainWindow::HighlightRegionTable(unsigned short label) { +void MainWindow::updateRegion(Region* region) { + regionTable->update(region); +} + +void MainWindow::highlightRegion(unsigned short label) { regionTable->highlight(label); } diff --git a/MainWindow.h b/MainWindow.h index 3971f25..12b03ce 100644 --- a/MainWindow.h +++ b/MainWindow.h @@ -9,17 +9,19 @@ #include class VisualizationContainer; +class Region; class RegionCollection; class RegionTable; class MainWindow : public QMainWindow, private Ui::MainWindow { - Q_OBJECT + Q_OBJECT public: MainWindow(); virtual ~MainWindow(); - void UpdateRegionTable(RegionCollection* regions); - void HighlightRegionTable(unsigned short label); + void updateRegions(RegionCollection* regions); + void updateRegion(Region* region); + void highlightRegion(unsigned short label); public slots: // Use Qt's auto-connect magic to tie GUI widgets to slots, diff --git a/RegionTable.cxx b/RegionTable.cxx index f740ae0..4afd4d2 100644 --- a/RegionTable.cxx +++ b/RegionTable.cxx @@ -27,6 +27,7 @@ RegionTable::RegionTable(QWidget* parent) setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents); QObject::connect(horizontalHeader(), &QHeaderView::sortIndicatorChanged, this, &RegionTable::on_sort); + QObject::connect(this, &RegionTable::removeRegion, this, &RegionTable::on_removeRegion); } void RegionTable::update(RegionCollection* regions) { @@ -133,6 +134,32 @@ void RegionTable::update(RegionCollection* regions) { highlight(0); } +void RegionTable::update(Region* region) { + QStyle* style = QApplication::style(); + QIcon modifiedIcon = style->standardIcon(QStyle::SP_MessageBoxWarning); + + QString labelString = QString::number(region->GetLabel()); + + for (int i = 0; i < rowCount(); i++) { + QTableWidgetItem* ti = item(i, 0); + + if (ti->text() == labelString) { + // Size + item(i, 2)->setData(0, region->GetNumVoxels()); + + // Modified + item(i, 3)->setData(0, region->GetModified()); + ((QPushButton*)cellWidget(i, 3))->setIcon(region->GetModified() ? modifiedIcon : QIcon()); + + // Done + item(i, 4)->setData(0, region->GetDone()); + ((QCheckBox*)cellWidget(i, 4))->setChecked(region->GetDone()); + + break; + } + } +} + void RegionTable::highlight(unsigned short label) { QString labelString = QString::number(label); @@ -154,4 +181,18 @@ void RegionTable::highlight(unsigned short label) { void RegionTable::on_sort() { resizeColumnsToContents(); +} + +void RegionTable::on_removeRegion(int label) { + QString labelString = QString::number(label); + + for (int i = 0; i < rowCount(); i++) { + QTableWidgetItem* ti = item(i, 0); + + if (ti->text() == labelString) { + removeRow(i); + + break; + } + } } \ No newline at end of file diff --git a/RegionTable.h b/RegionTable.h index 65fca10..e8b4a8f 100644 --- a/RegionTable.h +++ b/RegionTable.h @@ -3,8 +3,7 @@ #include -class QSignalMapper; - +class Region; class RegionCollection; class RegionTable : public QTableWidget { @@ -13,10 +12,12 @@ class RegionTable : public QTableWidget { RegionTable(QWidget* parent = 0); void update(RegionCollection* regions); + void update(Region* region); void highlight(unsigned short label); public slots: void on_sort(); + void on_removeRegion(int label); signals: void regionDone(int label, bool done); diff --git a/VisualizationContainer.cxx b/VisualizationContainer.cxx index 52feeee..e1096ae 100644 --- a/VisualizationContainer.cxx +++ b/VisualizationContainer.cxx @@ -194,7 +194,7 @@ VisualizationContainer::FileErrorCode VisualizationContainer::OpenSegmentationFi if (SetLabelData(reader->GetOutput())) { LoadRegionMetadata(fileName + ".json"); - qtWindow->UpdateRegionTable(regions); + qtWindow->updateRegions(regions); return Success; } @@ -210,7 +210,7 @@ VisualizationContainer::FileErrorCode VisualizationContainer::OpenSegmentationFi if (SetLabelData(reader->GetOutput())) { LoadRegionMetadata(fileName + ".json"); - qtWindow->UpdateRegionTable(regions); + qtWindow->updateRegions(regions); return Success; } @@ -245,7 +245,7 @@ VisualizationContainer::FileErrorCode VisualizationContainer::OpenSegmentationSt if (SetLabelData(reader->GetOutput())) { LoadRegionMetadata(fileNames[0] + ".json"); - qtWindow->UpdateRegionTable(regions); + qtWindow->updateRegions(regions); return Success; } @@ -327,7 +327,7 @@ void VisualizationContainer::SegmentVolume() { UpdateLabels(); - qtWindow->UpdateRegionTable(regions); + qtWindow->updateRegions(regions); Render(); } @@ -355,7 +355,7 @@ void VisualizationContainer::Paint(int x, int y, int z) { SetLabel(x, y, z, currentRegion->GetLabel()); currentRegion->SetModified(true); - qtWindow->UpdateRegionTable(regions); + qtWindow->updateRegion(currentRegion); } void VisualizationContainer::Erase(int x, int y, int z) { @@ -366,7 +366,7 @@ void VisualizationContainer::Erase(int x, int y, int z) { SetLabel(x, y, z, 0); currentRegion->SetModified(true); - qtWindow->UpdateRegionTable(regions); + qtWindow->updateRegion(currentRegion); } void VisualizationContainer::PickPointLabel(double x, double y, double z) { @@ -404,7 +404,7 @@ void VisualizationContainer::SetCurrentRegion(Region* region) { volumeView->SetCurrentRegion(currentRegion); sliceView->SetCurrentRegion(currentRegion); - qtWindow->HighlightRegionTable(region ? region->GetLabel() : 0); + qtWindow->highlightRegion(region ? region->GetLabel() : 0); } void VisualizationContainer::RelabelCurrentRegion() { @@ -474,7 +474,7 @@ void VisualizationContainer::RelabelCurrentRegion() { } } - qtWindow->UpdateRegionTable(regions); + qtWindow->updateRegions(regions); labels->Modified(); Render(); @@ -601,7 +601,7 @@ void VisualizationContainer::SetRegionDone(unsigned short label, bool done) { UpdateColors(label); } - qtWindow->UpdateRegionTable(regions); + qtWindow->updateRegion(region); Render(); } @@ -612,7 +612,6 @@ void VisualizationContainer::RemoveRegion(unsigned short label) { if (region == currentRegion) SetCurrentRegion(nullptr); regions->Remove(label); - qtWindow->UpdateRegionTable(regions); Render(); } @@ -632,7 +631,7 @@ SliceView* VisualizationContainer::GetSliceView() { void VisualizationContainer::SetImageData(vtkImageData* imageData) { regions->RemoveAll(); - qtWindow->UpdateRegionTable(regions); + qtWindow->updateRegions(regions); data = imageData;