From 47acba68a3c1afef034d292ace730c85fd493313 Mon Sep 17 00:00:00 2001 From: Krad Date: Wed, 3 Aug 2022 11:07:35 +0800 Subject: [PATCH] Refactor QDicomViewer, extract toolbar DefaultToolBar class,add state check. --- src/src/UI/Manager/ImageViewManager.cpp | 22 +++++++++++++++++++ src/src/UI/Manager/ImageViewManager.h | 2 ++ .../UI/Manager/ImageViewStateCheckWorker.cpp | 12 +++++----- .../UI/Manager/ImageViewStateCheckWorker.h | 2 +- .../UI/Widget/ImageView/dicomimageview.cpp | 4 ++++ src/src/UI/Widget/ImageView/dicomimageview.h | 18 ++++++++++----- src/src/UI/Widget/ToolBar/DefaultToolBar.cpp | 14 +++++++++--- src/src/UI/Widget/ToolBar/DefaultToolBar.h | 3 +++ src/src/UI/Window/QDicomViewer.cpp | 4 ++-- 9 files changed, 64 insertions(+), 17 deletions(-) diff --git a/src/src/UI/Manager/ImageViewManager.cpp b/src/src/UI/Manager/ImageViewManager.cpp index 7941aad..026ca60 100644 --- a/src/src/UI/Manager/ImageViewManager.cpp +++ b/src/src/UI/Manager/ImageViewManager.cpp @@ -393,6 +393,28 @@ bool ImageViewManager::checkViewFusion(DicomImageView *view) { return false; } +int ImageViewManager::checkSyncAbility(DicomImageView* view) { + bool flag = false; + this->smartDo([](auto v, auto callData) { + bool *d = (bool *) callData; + if (d[0]) return; + if (v->hasSeries()) { + d[0] = true; + } + }, view, &flag, ImageViewManager::SameStudySeries); + if (flag) return AUTO_SYNC; + this->smartDo([](auto v, auto callData) { + bool *d = (bool *) callData; + if (d[0]) return; + if (v->hasSeries()) { + d[0] = true; + } + }, view, &flag, ImageViewManager::SameOrientationSeries); + + if (flag) return MANUAL_SYNC; + return DIS_SYNC; +} + void ImageViewManager::clearCurrentView() { currentView->viewCleared(); } diff --git a/src/src/UI/Manager/ImageViewManager.h b/src/src/UI/Manager/ImageViewManager.h index 7616ecc..88f4164 100644 --- a/src/src/UI/Manager/ImageViewManager.h +++ b/src/src/UI/Manager/ImageViewManager.h @@ -98,6 +98,8 @@ public: void switchFusion(bool fusion); + int checkSyncAbility(DicomImageView* view); + enum DoScope { Current, SameSeries, diff --git a/src/src/UI/Manager/ImageViewStateCheckWorker.cpp b/src/src/UI/Manager/ImageViewStateCheckWorker.cpp index 96db835..d7b9419 100644 --- a/src/src/UI/Manager/ImageViewStateCheckWorker.cpp +++ b/src/src/UI/Manager/ImageViewStateCheckWorker.cpp @@ -17,10 +17,12 @@ ImageViewStateCheckWorker::~ImageViewStateCheckWorker() { void ImageViewStateCheckWorker::checkImageViewState(DicomImageView *view) { if (!mManager || !view) return; - QThread::sleep(2); + ViewFunctionState state; - state.canSync=false; - state.canMPR=true; - state.canFusion=true; - emit imageViewStateChanged(state); + if (view->hasSeries()){ + state.canSync=mManager->checkSyncAbility(view); + state.canMPR=view->checkMPRAble(); + state.canFusion=mManager->checkViewFusion(view); + emit imageViewStateChanged(state); + } } diff --git a/src/src/UI/Manager/ImageViewStateCheckWorker.h b/src/src/UI/Manager/ImageViewStateCheckWorker.h index 3ba7009..b12253d 100644 --- a/src/src/UI/Manager/ImageViewStateCheckWorker.h +++ b/src/src/UI/Manager/ImageViewStateCheckWorker.h @@ -11,7 +11,7 @@ class DicomImageView; class ImageViewManager; struct ViewFunctionState{ - bool canSync; + int canSync; bool canMPR; bool canFusion; }; diff --git a/src/src/UI/Widget/ImageView/dicomimageview.cpp b/src/src/UI/Widget/ImageView/dicomimageview.cpp index 1e34d28..d014e78 100644 --- a/src/src/UI/Widget/ImageView/dicomimageview.cpp +++ b/src/src/UI/Widget/ImageView/dicomimageview.cpp @@ -737,3 +737,7 @@ bool DicomImageView::checkFusion(DicomImageView *overlap) { return DicomImageView::checkFusion(this, overlap); } +bool DicomImageView::checkMPRAble(DicomImageView *view) { + return (view->getSeriesInstance()->GetProperty()->GetSliceCount() > 20 ); +} + diff --git a/src/src/UI/Widget/ImageView/dicomimageview.h b/src/src/UI/Widget/ImageView/dicomimageview.h index f415729..c41fe72 100644 --- a/src/src/UI/Widget/ImageView/dicomimageview.h +++ b/src/src/UI/Widget/ImageView/dicomimageview.h @@ -32,10 +32,6 @@ public: ~DicomImageView() override; - static bool checkFusion(DicomImageView *base, DicomImageView *overlap); - - bool checkFusion(DicomImageView *overlap); - void showMetaData(); QVTKOpenGLNativeWidget *getGLWidget() { @@ -64,12 +60,12 @@ public: //Reset void resetView(); - //Corner Info void updateCornerInfoAll(); void updateCornerInfoPrivacy(); + //Window level void getWindowLevel(double &level, double &width); @@ -84,7 +80,6 @@ public: void rotateImage(double angle, TransFormType operation); - //Fusion bool isFusion(); @@ -94,6 +89,10 @@ public: void unloadFusion(); + bool checkFusion(DicomImageView *overlap); + + static bool checkFusion(DicomImageView *base, DicomImageView *overlap); + //Measure void activeMeasure(Measure *m); @@ -152,6 +151,7 @@ public: //Negative void negativeWindow(); + //MPR void setSliceOrientation(int orientation); int getSliceOrientation(); @@ -168,6 +168,12 @@ public: mImageViewer->applySliceOffset(offset, direction); } + bool checkMPRAble(){ + return DicomImageView::checkMPRAble(this); + } + + static bool checkMPRAble(DicomImageView* view); + void loadSeries(SeriesImageSet *series); signals: diff --git a/src/src/UI/Widget/ToolBar/DefaultToolBar.cpp b/src/src/UI/Widget/ToolBar/DefaultToolBar.cpp index 5164403..5cfc6cb 100644 --- a/src/src/UI/Widget/ToolBar/DefaultToolBar.cpp +++ b/src/src/UI/Widget/ToolBar/DefaultToolBar.cpp @@ -363,7 +363,7 @@ void DefaultToolBar::SetupFusionTool() { }); mBtnFusion->setPopupMode(QToolButton::MenuButtonPopup); mBtnFusion->setMenu(m); -// mBtnFusion->setEnabled(false); + mBtnFusion->setEnabled(false); } void DefaultToolBar::SetupCineTool() { @@ -408,16 +408,24 @@ void DefaultToolBar::SetupMPR(){ syncStateChanged(); emit changeSliceOrientation(); }); -// mBtnMPR->setEnabled(false); + mBtnMPR->setEnabled(false); } void DefaultToolBar::resetNeedCheckFunctionButtons(){ -// mBtnMPR->setEnabled(false); + mBtnMPR->setEnabled(false); mBtnFusion->setEnabled(false); SyncHelper::setSyncState(DIS_SYNC); syncStateChanged(); } +void DefaultToolBar::updateNeedCheckFunctionButtons(ViewFunctionState state) +{ + mBtnMPR->setEnabled(state.canMPR); + mBtnFusion->setEnabled(state.canFusion); +// SyncHelper::setSyncState((SyncState)state.canSync); +// syncStateChanged(); +} + void DefaultToolBar::SetupScreenTool() { mBtnFullScreen->setToolTip(QString("Full screen")); connect(mBtnFullScreen, &QToolButton::clicked, this, [=] { diff --git a/src/src/UI/Widget/ToolBar/DefaultToolBar.h b/src/src/UI/Widget/ToolBar/DefaultToolBar.h index 578b931..4f4a147 100644 --- a/src/src/UI/Widget/ToolBar/DefaultToolBar.h +++ b/src/src/UI/Widget/ToolBar/DefaultToolBar.h @@ -6,7 +6,9 @@ #define OMEGAV_DEFAULTTOOLBAR_H #include + #include "Common/QGlobals.h" +#include "UI/Manager/ImageViewStateCheckWorker.h" class QButtonGroup; @@ -18,6 +20,7 @@ public: ~DefaultToolBar(); void resetNeedCheckFunctionButtons(); + void updateNeedCheckFunctionButtons(ViewFunctionState state); signals: void openFile(); diff --git a/src/src/UI/Window/QDicomViewer.cpp b/src/src/UI/Window/QDicomViewer.cpp index a2110d7..07099d0 100644 --- a/src/src/UI/Window/QDicomViewer.cpp +++ b/src/src/UI/Window/QDicomViewer.cpp @@ -72,8 +72,8 @@ void QDicomViewer::SetupConnections() { connect(ui->viewContainer->getViewManager(), &ImageViewManager::currentViewReload, &worker,&ImageViewStateCheckWorker::checkImageViewState, Qt::QueuedConnection); -// connect(&worker,&ImageViewStateCheckWorker::imageViewStateChanged, -// this,&QDicomViewer::resetToolBarButtons, Qt::QueuedConnection); + connect(&worker,&ImageViewStateCheckWorker::imageViewStateChanged, + ui->toolBar,&DefaultToolBar::updateNeedCheckFunctionButtons, Qt::QueuedConnection); workerManager.registerWorker(&worker); //通知左侧的缩略图bar ,当前选中series的变换