From 5a1d95a4f4f807c41d08b4533ffbe18f40961e13 Mon Sep 17 00:00:00 2001 From: Krad Date: Mon, 25 Jul 2022 16:15:14 +0800 Subject: [PATCH] Fix view[0] repeat connect slots bug. --- src/src/UI/Manager/ImageViewManager.cpp | 111 ++++++++++++++-------- src/src/UI/Manager/ImageViewManager.h | 14 ++- src/src/UI/Widget/ViewContainerWidget.cpp | 5 +- 3 files changed, 85 insertions(+), 45 deletions(-) diff --git a/src/src/UI/Manager/ImageViewManager.cpp b/src/src/UI/Manager/ImageViewManager.cpp index 560f790..17eda62 100644 --- a/src/src/UI/Manager/ImageViewManager.cpp +++ b/src/src/UI/Manager/ImageViewManager.cpp @@ -35,16 +35,23 @@ void ImageViewManager::add(DicomImageView *view) { connect(view, &DicomImageView::onViewDoubleClick, this, &ImageViewManager::viewDoubleClicked); - connect(view, &DicomImageView::afterViewCleared,this, &ImageViewManager::viewCleared); + connect(view, &DicomImageView::afterViewCleared, + this, &ImageViewManager::viewCleared); connect(view, &DicomImageView::onDragDrop, [=](DicomImageView *view, const std::string &id) { setCurrentView(view); viewReload(id); }); - connect(view, &DicomImageView::onSync, - this, &ImageViewManager::viewSynced); +// connect(view, &DicomImageView::onSync, +// this, &ImageViewManager::viewSynced); + connect(view, &DicomImageView::onEndPan, + this, &ImageViewManager::viewPaned); + connect(view, &DicomImageView::onEndZoom, + this, &ImageViewManager::viewZoomed); + connect(view, &DicomImageView::onEndWindowLevel, + this, &ImageViewManager::viewEndWindowLeveL); vList.push_back(view); } } @@ -58,9 +65,26 @@ void ImageViewManager::remove(DicomImageView *view) { void ImageViewManager::remove(int idx) { if (idx >= vList.size()) return; - auto view = vList.at(idx); - vList.removeOne(view); - delete view; + vList.takeAt(idx)->deleteLater(); +} + +DicomImageView * ImageViewManager::takeAt(int idx){ + if (idx >= vList.size()) return nullptr; + auto view = vList.takeAt(idx); + disconnect(view, &DicomImageView::onViewClick,nullptr,nullptr); + disconnect(view, &DicomImageView::onViewDoubleClick,nullptr,nullptr); + disconnect(view, &DicomImageView::afterViewCleared,nullptr,nullptr); + disconnect(view, &DicomImageView::onDragDrop,nullptr,nullptr); + disconnect(view, &DicomImageView::onEndPan,nullptr,nullptr); + disconnect(view, &DicomImageView::onEndZoom,nullptr,nullptr); + disconnect(view, &DicomImageView::onEndWindowLevel,nullptr,nullptr); + return view; +} + +void ImageViewManager::clear(){ + while(!vList.isEmpty()){ + vList.takeFirst()->deleteLater(); + } } @@ -179,39 +203,51 @@ void ImageViewManager::viewSynced(DicomImageView *src, int interactionMode, void } break; - case VTKIS_IMAGE_PAN: - if (SyncHelper::getSyncItem(ZOOM_PAN)) { - this->smartDo([](auto v, auto callData) { - if (v->hasSeries()) { - double *d = (double *) callData; - double vector[3] = {d[3] - d[0], d[4] - d[1], d[5] - d[2]}; - v->setPanOffset(vector); - } - }, src, data, ImageViewManager::EStudyEBoundsSeries); + } +} + +void ImageViewManager::viewPaned(DicomImageView *src, void* offsetVector) { + if (SyncHelper::getSyncItem(ZOOM_PAN)) { + if (SyncHelper::getSyncState() == MANUAL_SYNC) { + this->smartDo([](auto v, auto callData) { + if (v->hasSeries()) { + double *d = (double *) callData; + double vector[3] = {d[3] - d[0], d[4] - d[1], d[5] - d[2]}; + v->setPanOffset(vector); + } + }, src, offsetVector, ImageViewManager::EStudyEBoundsSeries); + } else if (SyncHelper::getSyncState() == AUTO_SYNC) { + this->smartDo([](auto v, auto callData) { + if (v->hasSeries()) { + double *d = (double *) callData; + double vector[3] = {d[3], d[4] , d[5]}; + v->setPanFocalPoint(vector); + } + }, src, offsetVector, ImageViewManager::EStudyEBoundsSeries); + } + } +} + +void ImageViewManager::viewZoomed(DicomImageView *src, double scaleFactor) { + if (SyncHelper::getSyncItem(ZOOM_PAN)) { + this->smartDo([](auto v, auto callData) { + if (v->hasSeries()) { + double d = *(double *) callData; + v->setZoomScale(d); } - break; - case VTKIS_IMAGE_ZOOM: - if (SyncHelper::getSyncItem(ZOOM_PAN)) { - this->smartDo([](auto v, auto callData) { - if (v->hasSeries()) { - double *d = (double *) callData; - v->setZoomScale(d[1]); - } - }, src, data, ImageViewManager::EStudyEBoundsSeries); + }, src, &scaleFactor, ImageViewManager::EStudyEBoundsSeries); + } +} + +void ImageViewManager::viewEndWindowLeveL(DicomImageView *src, double level, double window) { + double data[2] = {level, window}; + if (SyncHelper::getSyncItem(WIDTH_LEVEL)) { + this->smartDo([](auto v, auto callData) { + if (v->hasSeries()) { + double *d = (double *) callData; + v->setWindowLevel(d[0], d[1]); } - break; - case VTKIS_IMAGE_WINDOWLEVEL: - if (SyncHelper::getSyncItem(WIDTH_LEVEL)) { - this->smartDo([](auto v, auto callData) { - if (v->hasSeries()) { - double *d = (double *) callData; - v->setWindowLevel(d[1], d[0]); - } - }, src, data, ImageViewManager::EStudyEBoundsSeries); - } - break; - default: - break; + }, src, data, ImageViewManager::EStudyEBoundsSeries); } } @@ -313,3 +349,4 @@ void ImageViewManager::checkCurrentViewFusion() { currentFusionView = nullptr; emit fusionCheckStateChanged(false); } + diff --git a/src/src/UI/Manager/ImageViewManager.h b/src/src/UI/Manager/ImageViewManager.h index db70c59..99d43d9 100644 --- a/src/src/UI/Manager/ImageViewManager.h +++ b/src/src/UI/Manager/ImageViewManager.h @@ -30,11 +30,11 @@ public: void remove(int idx); - void setCurrentView(DicomImageView *view); + DicomImageView * takeAt(int idx); - void clear() { - vList.clear(); - } + void clear(); + + void setCurrentView(DicomImageView *view); DicomImageView *getCurrentView() { return currentView; @@ -66,6 +66,12 @@ public: void viewSynced(DicomImageView *src, int interactionMode, void *data); + void viewPaned(DicomImageView *src, void* offsetVector); + + void viewZoomed(DicomImageView *src, double scaleFactor); + + void viewEndWindowLeveL(DicomImageView *src, double level, double window); + void viewReload(const std::string &unique_info); void viewCleared(); diff --git a/src/src/UI/Widget/ViewContainerWidget.cpp b/src/src/UI/Widget/ViewContainerWidget.cpp index 8a2ca4c..6b5f690 100644 --- a/src/src/UI/Widget/ViewContainerWidget.cpp +++ b/src/src/UI/Widget/ViewContainerWidget.cpp @@ -95,10 +95,7 @@ void ViewContainerWidget::viewLayoutChanged(int col, int row) { void ViewContainerWidget::resetLayoutToSingle() { viewLayoutChanged(1, 1); - while (mViewManager->getViewCount() > 1) { - mViewManager->remove(1); - } - DicomImageView *v = mViewManager->getView(0); + DicomImageView *v = mViewManager->takeAt(0); mViewManager->clear(); mViewManager->add(v); mViewManager->setCurrentView(v);