diff --git a/src/src/Common/QGlobals.h b/src/src/Common/QGlobals.h index aba064b..52f337a 100644 --- a/src/src/Common/QGlobals.h +++ b/src/src/Common/QGlobals.h @@ -82,10 +82,11 @@ enum AnnotationActorType ArrowAnn, EllipseAnn, TextAnn, - //HiddenAnn, - DeleteSelectedAnn, - DeleteSliceAnn, - DeleteSeriesAnn +}; +enum AnnotationDeleteType{ + DeleteSelectedAnn, + DeleteSliceAnn, + DeleteSeriesAnn }; @@ -188,12 +189,16 @@ public: } static void PrivacyOn() { + if (privacyOn) return; privacyOn = true; + EventsCenter::TriggerEvent(AnonymizeStateChanged); } static void PrivacyOff() { + if (!privacyOn) return; privacyOn = false; - } + EventsCenter::TriggerEvent(AnonymizeStateChanged); + } static bool IsAnno() { @@ -202,7 +207,8 @@ public: static void toggleAnno() { annotOn = !annotOn; - } + EventsCenter::TriggerEvent(AnnotationStateChanged); + } private: static bool privacyOn; @@ -219,6 +225,12 @@ public: } static void setMeasureType(int type){ measureType = type; + EventsCenter::TriggerEvent(MeasureTypeChanged); + } + static void deleteMeasure(int deleteType){ + EventObject type; + type.AddDetailValue("type",deleteType); + EventsCenter::TriggerEvent(MeasureDelete, &type); } private: static int measureType; diff --git a/src/src/Events/EventsCenter.h b/src/src/Events/EventsCenter.h index 536e610..b105b85 100644 --- a/src/src/Events/EventsCenter.h +++ b/src/src/Events/EventsCenter.h @@ -5,14 +5,20 @@ #ifndef OMEGAV_EVENTSCENTER_H #define OMEGAV_EVENTSCENTER_H -#include -#include "QtCore/qmap.h" -#include "QString" +#include +#include +#include +#include #define aLLEventMacro() \ _add_Event(DefaultEvent)\ _add_Event(DragEvent)\ - _add_Event(SyncStateChanged) + _add_Event(SyncStateChanged)\ + _add_Event(AnnotationStateChanged)\ + _add_Event(AnonymizeStateChanged)\ + _add_Event(MeasureHideChanged)\ + _add_Event(MeasureTypeChanged)\ + _add_Event(MeasureDelete) enum Events{ @@ -24,8 +30,8 @@ class EventObject { public: void* Sender= nullptr; bool Cancel = false; - QMap Detail; - void AddDetailValue(const QString& key, void* val) + QMap Detail; + void AddDetailValue(const QString& key, QVariant val) { Detail[key]=val; } diff --git a/src/src/Rendering/Measure/Measure.h b/src/src/Rendering/Measure/Measure.h index ee00f64..6ca09e7 100644 --- a/src/src/Rendering/Measure/Measure.h +++ b/src/src/Rendering/Measure/Measure.h @@ -10,6 +10,7 @@ Measure* GetNextMeasure() override\ #include +#include "Events/EventsCenter.h" class vtkRenderWindowInteractor; @@ -49,7 +50,9 @@ public: } static void SetHidden(bool h) { + if (Measure::Hidden == h) return; Measure::Hidden = h; + EventsCenter::TriggerEvent(MeasureHideChanged); } static bool GetHidden() { diff --git a/src/src/UI/Manager/ImageViewManager.cpp b/src/src/UI/Manager/ImageViewManager.cpp index 8eb0da7..7941aad 100644 --- a/src/src/UI/Manager/ImageViewManager.cpp +++ b/src/src/UI/Manager/ImageViewManager.cpp @@ -19,6 +19,20 @@ ImageViewManager::ImageViewManager(QObject *parent) : QObject(parent), currentView(nullptr), currentFusionView(nullptr), mMaxed(false) { + connect(EventsCenter::Default(),&EventsCenter::AnnotationStateChanged, + this, &ImageViewManager::updateCornerInfoAll); + + connect(EventsCenter::Default(),&EventsCenter::AnonymizeStateChanged, + this, &ImageViewManager::updateCornerInfoPrivacy); + + connect(EventsCenter::Default(),&EventsCenter::MeasureHideChanged, + this, &ImageViewManager::renderAll); + + connect(EventsCenter::Default(),&EventsCenter::MeasureTypeChanged, + this, &ImageViewManager::activeMeasure); + + connect(EventsCenter::Default(),&EventsCenter::MeasureDelete, + this, &ImageViewManager::deleteMeasure); } // views manage---------------------------------------------------------------- @@ -299,6 +313,28 @@ void ImageViewManager::activeMeasure() { }, nullptr, nullptr, ImageViewManager::All); } +void ImageViewManager::deleteMeasure(EventObject* deleteType){ + switch (deleteType->Detail["type"].toInt()) { + case AnnotationDeleteType::DeleteSelectedAnn: + if (currentView != nullptr) { + currentView->deleteSelectedMeasure(); + } + break; + case AnnotationDeleteType::DeleteSliceAnn: + if (currentView != nullptr) { + currentView->deleteCurrentSliceMeasure(); + } + break; + case AnnotationDeleteType::DeleteSeriesAnn: + if (currentView != nullptr) { + currentView->deleteCurrentSeriesMeasure(); + } + break; + default: + break; + } +} + void ImageViewManager::switchSliceOrientation() { currentView->setSliceOrientation((currentView->getSliceOrientation() + 1) % 3); emit currentViewReload(currentView); diff --git a/src/src/UI/Manager/ImageViewManager.h b/src/src/UI/Manager/ImageViewManager.h index 218c787..7616ecc 100644 --- a/src/src/UI/Manager/ImageViewManager.h +++ b/src/src/UI/Manager/ImageViewManager.h @@ -84,6 +84,8 @@ public: void activeMeasure(); + void deleteMeasure(EventObject* deleteType); + void switchSliceOrientation(); void updateCornerInfoAll(); diff --git a/src/src/UI/Widget/ToolBar/DefaultToolBar.cpp b/src/src/UI/Widget/ToolBar/DefaultToolBar.cpp index 04e46ec..5164403 100644 --- a/src/src/UI/Widget/ToolBar/DefaultToolBar.cpp +++ b/src/src/UI/Widget/ToolBar/DefaultToolBar.cpp @@ -125,9 +125,11 @@ void DefaultToolBar::initButtons() { SetupExportTool(); SetupGridTool(); SetupSyncTool(); + SetupAnnoTool(); SetupModeTool(); SetupTransformTool(); SetupFusionTool(); + SetupMPR(); SetupCineTool(); SetupEmptyTool(); SetupScreenTool(); @@ -205,7 +207,7 @@ void DefaultToolBar::SetupSyncTool() { void DefaultToolBar::syncStateChanged() const { switch (SyncHelper::getSyncState()) { case AUTO_SYNC: -// mBtnSync->setIcon(mAutoIcon); + mBtnSync->setIcon(mAutoIcon); mActionSyncState->setText(QString(tr("CUR STATE: %1")).arg(SyncHelper::SyncStateName[AUTO_SYNC])); for (int i = 0; i < SYNC_ITEM_NUM; i++) { mSyncActions[i]->setDisabled(false); @@ -216,7 +218,7 @@ void DefaultToolBar::syncStateChanged() const { break; case MANUAL_SYNC:{ -// mBtnSync->setIcon(mManualIcon); + mBtnSync->setIcon(mManualIcon); mActionSyncState->setText(QString(tr("CUR STATE: %1")).arg(SyncHelper::SyncStateName[MANUAL_SYNC])); mSyncActions[SLICE_POS]->setChecked(SyncHelper::getSyncItem(SLICE_POS)); mSyncActions[WIDTH_LEVEL]->setChecked(SyncHelper::getSyncItem(WIDTH_LEVEL)); @@ -224,7 +226,7 @@ void DefaultToolBar::syncStateChanged() const { break; } case DIS_SYNC: -// mBtnSync->setIcon(mDisIcon); + mBtnSync->setIcon(mDisIcon); mActionSyncState->setText(QString(tr("CUR STATE: %1")).arg(SyncHelper::SyncStateName[DIS_SYNC])); for (int i = 0; i < SYNC_ITEM_NUM; i++) { mSyncActions[i]->setChecked(false); @@ -239,7 +241,7 @@ void DefaultToolBar::syncStateChanged() const { void DefaultToolBar::SetupModeTool() { mBtnWindow->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); mBtnWindow->setToolTip(QString("Adjust window level")); - connect(mBtnWindow, &QToolButton::clicked, this, [&] { + connect(mBtnWindow, &QToolButton::clicked, this, [=]() { emit modeChanged(7); }); @@ -255,17 +257,17 @@ void DefaultToolBar::SetupModeTool() { mBtnWindow->setMenu(m); mBtnPan->setToolTip(QString("Pan image")); - connect(mBtnPan, &QToolButton::clicked, this, [&] { + connect(mBtnPan, &QToolButton::clicked, this, [=]() { emit modeChanged(5); }); mBtnZoom->setToolTip(QString("Zoom image")); - connect(mBtnZoom, &QToolButton::clicked, this, [&] { + connect(mBtnZoom, &QToolButton::clicked, this, [=]() { emit modeChanged(6); }); mBtnSlice->setToolTip(QString("Browse series")); - connect(mBtnSlice, &QToolButton::clicked, this, [&] { + connect(mBtnSlice, &QToolButton::clicked, this, [=]() { emit modeChanged(4); }); @@ -274,27 +276,14 @@ void DefaultToolBar::SetupModeTool() { void DefaultToolBar::SetupAnnoTool() { mBtnAnonymize->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); - - //主要设置了四角标签的操作逻辑 mBtnAnonymize->setToolTip(QString("Toggle annotations")); - //视窗操作,显隐脚注 - -// connect(mBtnAnonymize, &QToolButton::clicked, this, [=] { -// AnnoHelper::toggleAnno(); -// ui->viewContainer->getViewManager()->updateCornerInfoAll(); -// }); - + mBtnAnonymize->setCheckable(true); //视窗操作,显隐测量 QMenu *m; m = new QMenu(this); -// connect(m, &QMenu::triggered, this, [=] { -// //load data -// mActionHideMeasure->setChecked(Measure::GetHidden()); -// }); //视窗操作,显隐测量 mActionHideMeasure = m->addAction(tr("Hide all measurements"), this, [=](bool value) { - Measure::SetHidden(!mActionHideMeasure->isChecked()); -// ui->viewContainer->getViewManager()->renderAll(); + Measure::SetHidden(mActionHideMeasure->isChecked()); }); mActionHideMeasure->setCheckable(true); mActionHideMeasure->setChecked(false); @@ -308,13 +297,20 @@ void DefaultToolBar::SetupAnnoTool() { } else { AnnoHelper::PrivacyOff(); } -// ui->viewContainer->getViewManager()->updateCornerInfoPrivacy(); + mBtnAnonymize->setChecked(mActionHidePatData->isChecked()); }); mActionHidePatData->setCheckable(true); mActionHidePatData->setChecked(false); - m->addAction(tr("Show Dicom tags"), this, &DefaultToolBar::showMeta); + connect(mBtnAnonymize,&QToolButton::clicked,this,[=]{ + if (mBtnAnonymize->isChecked()) { + AnnoHelper::PrivacyOn(); + } else { + AnnoHelper::PrivacyOff(); + } + mActionHidePatData->setChecked(mBtnAnonymize->isChecked()); + }); mBtnAnonymize->setPopupMode(QToolButton::MenuButtonPopup); mBtnAnonymize->setMenu(m); } @@ -325,18 +321,21 @@ void DefaultToolBar::SetupMeasureTool() { mBtnMeasure->setChecked(true);\ QPixmap map(std::get<1>(MEASURE_ACTIIONS[index]));\ mBtnMeasure->setIcon(QIcon(map));\ + MeasureHelper::setMeasureType(std::get<2>(MEASURE_ACTIIONS[index]));\ }) -// MeasureHelper::setMeasureType(std::get<2>(MEASURE_ACTIIONS[index]));\ -// ui->viewContainer->getViewManager()->activeMeasure();\ -#define ADD_DEL_ACTION(text, type, func)\ - m->addAction(tr(text)); +#define ADD_DEL_ACTION(text, type)\ + m->addAction(tr(text),this,[]{\ + MeasureHelper::deleteMeasure(type);\ +}); mBtnMeasure->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); mBtnMeasure->setToolTip(QString("Measurements")); - connect(mBtnMeasure, &QToolButton::clicked, this, &DefaultToolBar::activeMeasure); + connect(mBtnMeasure, &QToolButton::clicked, [=](){ + MeasureHelper::setMeasureType(MeasureHelper::getMeasureType()); + }); QMenu *m; m = new QMenu(this); @@ -345,9 +344,9 @@ void DefaultToolBar::SetupMeasureTool() { ADD_MEASURE_ACTION(j); } m->addSeparator(); - ADD_DEL_ACTION("Delete selected", AnnotationActorType::DeleteSelectedAnn, deleteSelectedMeasure); - ADD_DEL_ACTION("Delete all in current slice", AnnotationActorType::DeleteSliceAnn, deleteCurrentSliceMeasure); - ADD_DEL_ACTION("Delete all in current series", AnnotationActorType::DeleteSeriesAnn, deleteCurrentSeriesMeasure); + ADD_DEL_ACTION("Delete selected", AnnotationDeleteType::DeleteSelectedAnn); + ADD_DEL_ACTION("Delete all in current slice", AnnotationDeleteType::DeleteSliceAnn); + ADD_DEL_ACTION("Delete all in current series", AnnotationDeleteType::DeleteSeriesAnn); mBtnMeasure->setPopupMode(QToolButton::MenuButtonPopup); mBtnMeasure->setMenu(m); } @@ -364,7 +363,7 @@ void DefaultToolBar::SetupFusionTool() { }); mBtnFusion->setPopupMode(QToolButton::MenuButtonPopup); mBtnFusion->setMenu(m); - mBtnFusion->setEnabled(false); +// mBtnFusion->setEnabled(false); } void DefaultToolBar::SetupCineTool() { @@ -403,6 +402,22 @@ void DefaultToolBar::SetupTransformTool() { }); } +void DefaultToolBar::SetupMPR(){ + connect(mBtnMPR, &QToolButton::clicked, [=](){ + SyncHelper::setSyncState(DIS_SYNC); + syncStateChanged(); + emit changeSliceOrientation(); + }); +// mBtnMPR->setEnabled(false); +} + +void DefaultToolBar::resetNeedCheckFunctionButtons(){ +// mBtnMPR->setEnabled(false); + mBtnFusion->setEnabled(false); + SyncHelper::setSyncState(DIS_SYNC); + 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 45793d3..578b931 100644 --- a/src/src/UI/Widget/ToolBar/DefaultToolBar.h +++ b/src/src/UI/Widget/ToolBar/DefaultToolBar.h @@ -16,6 +16,9 @@ public: explicit DefaultToolBar(QWidget *parent = nullptr); ~DefaultToolBar(); + + void resetNeedCheckFunctionButtons(); + signals: void openFile(); void openFolder(); @@ -27,7 +30,7 @@ signals: void negativeWindow(); void fusion(bool on = false); void cine(bool on = false); - void activeMeasure(); + void changeSliceOrientation(); void clear(); void parentWindowStateChange(Qt::WindowState state); void parentWindowClose(); @@ -40,6 +43,7 @@ private: void initButtons(); void syncStateChanged() const; + void SetupMPR(); void SetupFileTool(); void SetupImportTool(); diff --git a/src/src/UI/Window/QDicomViewer.cpp b/src/src/UI/Window/QDicomViewer.cpp index 382ac20..a2110d7 100644 --- a/src/src/UI/Window/QDicomViewer.cpp +++ b/src/src/UI/Window/QDicomViewer.cpp @@ -9,7 +9,6 @@ #include "Interaction/ActorDraggableInteractorStyle.h" #include "UI/Manager/ImageViewManager.h" -#include "UI/Widget/ToolBar/DefaultToolBar.h" #include "UI/Widget/Component/gridpopwidget.h" #include "UI/Widget/cine/pqVCRToolbar.h" @@ -46,16 +45,7 @@ QDicomViewer::~QDicomViewer() { } void QDicomViewer::Initial() { - SetupFileTool(); - SetupImportTool(); - SetupExportTool(); - SetupGridTool(); - SetupSyncTool(); - SetupTransformTool(); - SetupEmptyTool(); - SetupScreenTool(); -// this->createToolButton(); -// this->SetupConnections(); + this->SetupConnections(); } void QDicomViewer::loadStyleSheet(const QString &sheetName) { @@ -68,155 +58,38 @@ void QDicomViewer::loadStyleSheet(const QString &sheetName) { } } -void QDicomViewer::createToolButton() { +void QDicomViewer::SetupConnections() { - this->SetupFileTool(); - this->SetupImportTool(); - this->SetupExportTool(); + initGeneralTool(); + initViewOperation(); + initCine(); + initScreenControl(); - this->SetupGridTool(); - this->SetupSyncTool(); - this->SetupAnnoTool(); - - this->SetupAdjustTool(); - this->SetupMeasureTool(); - this->SetupEmptyTool(); - - this->SetupTransformTool(); - this->SetupFusionTool(); - this->SetupCineTool(); - - -// connect(btnMPR, &QToolButton::clicked, [=](){ -// SyncHelper::setSyncState(DIS_SYNC); -// syncStateChanged(); -// ui->viewContainer->getViewManager()->switchSliceOrientation(); -// }); -// btnMPR->setEnabled(false); -// mprBtn = btnMPR; -// fusionBtn = btnfusion; -// connect(ui->viewContainer->getViewManager(), -// &ImageViewManager::currentViewReload,[=](){ -// btnfusion->setEnabled(false); -// btnMPR->setEnabled(false); -// SyncHelper::setSyncState(DIS_SYNC); -// syncStateChanged(); -// }); + connect(ui->viewContainer->getViewManager(),&ImageViewManager::currentViewReload, + ui->toolBar, &DefaultToolBar::resetNeedCheckFunctionButtons); worker.setManager(ui->viewContainer->getViewManager()); connect(ui->viewContainer->getViewManager(), &ImageViewManager::currentViewReload, &worker,&ImageViewStateCheckWorker::checkImageViewState, Qt::QueuedConnection); - connect(&worker,&ImageViewStateCheckWorker::imageViewStateChanged, - this,&QDicomViewer::resetToolBarButtons, Qt::QueuedConnection); +// connect(&worker,&ImageViewStateCheckWorker::imageViewStateChanged, +// this,&QDicomViewer::resetToolBarButtons, Qt::QueuedConnection); workerManager.registerWorker(&worker); -} -void QDicomViewer::SetupScreenTool() { - connect(ui->toolBar,&DefaultToolBar::parentWindowStateChange,this,&QDicomViewer::setWindowState); - connect(ui->toolBar,&DefaultToolBar::parentWindowClose, this, &QWidget::close); -} + //通知左侧的缩略图bar ,当前选中series的变换 + connect(ui->viewContainer, &ViewContainerWidget::onThumbnailTrigger, + ui->thumbnailBar, &ThumbnailBarWidget::Slot_setCurrentThumbnail); -void QDicomViewer::SetupAnnoTool() { -// connect(annoBtn, &QToolButton::clicked, this, [=] { -// AnnoHelper::toggleAnno(); -// ui->viewContainer->getViewManager()->updateCornerInfoAll(); -// }); + //通知右侧显示区域,当前有series被点击 + connect(ui->thumbnailBar, &ThumbnailBarWidget::Signal_ThumbClicked, + ui->viewContainer->getViewManager(), &ImageViewManager::viewReload); -// //视窗操作,显隐测量 -// m_measure_hidden_action = m->addAction(tr("Hide all measurements"), this, [=](bool value) { -// Measure::SetHidden(value); -// ui->viewContainer->getViewManager()->renderAll(); -// }); - - - //视窗操作,匿名化 -// m_patient_hidden_action = m->addAction(tr("Hide patient data"), this, [=] { -// if (m_patient_hidden_action->isChecked()) { -// AnnoHelper::PrivacyOn(); -// } else { -// AnnoHelper::PrivacyOff(); -// } -// ui->viewContainer->getViewManager()->updateCornerInfoPrivacy(); -// }); -// m_patient_hidden_action->setCheckable(true); -// m_patient_hidden_action->setChecked(false); - - connect(ui->toolBar,&DefaultToolBar::showMeta, this, [&] { - DicomImageView *curV = ui->viewContainer->getCurrentView(); - if (curV->hasSeries()) { - curV->showMetaData(); - } - }); -} - -//AnnotationActor执行相关 -void QDicomViewer::SetupMeasureTool() { -#define ADD_MEASURE_ACTION(index)\ - m->addAction(tr(std::get<0>(MEASURE_ACTIIONS[index])), this, [=] {\ - measureBtn->setChecked(true);\ - QPixmap map(std::get<1>(MEASURE_ACTIIONS[index]));\ - measureBtn->setIcon(QIcon(map));\ - MeasureHelper::setMeasureType(std::get<2>(MEASURE_ACTIIONS[index]));\ - ui->viewContainer->getViewManager()->activeMeasure();\ -}) - -#define ADD_DEL_ACTION(text, type, func)\ - m->addAction(tr(text), this, [=] {\ - measureBtn->setChecked(true);\ - m_cur_measure = type;\ - DicomImageView* curV = ui->viewContainer->getCurrentView();\ - if (curV != nullptr)\ - {\ - curV->func();\ - }\ -}) -// measureBtn->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); -// measureBtn->setToolTip(QString("Measurements")); -// -// connect(measureBtn, &QToolButton::clicked, this, &QDicomViewer::executeActiveMeasure); -// -// QMenu *m; -// m = new QMenu(this); -// -// for (int j = 0; j < ACTION_COUNT; ++j) { -// ADD_MEASURE_ACTION(j); -// } -// m->addSeparator(); -// ADD_DEL_ACTION("Delete selected", AnnotationActorType::DeleteSelectedAnn, deleteSelectedMeasure); -// ADD_DEL_ACTION("Delete all in current slice", AnnotationActorType::DeleteSliceAnn, deleteCurrentSliceMeasure); -// ADD_DEL_ACTION("Delete all in current series", AnnotationActorType::DeleteSeriesAnn, deleteCurrentSeriesMeasure); -// measureBtn->setPopupMode(QToolButton::MenuButtonPopup); -// measureBtn->setMenu(m); -} - -void QDicomViewer::executeActiveMeasure() { - ui->viewContainer->getViewManager()->activeMeasure(); - DicomImageView *curV = ui->viewContainer->getCurrentView(); - switch (MeasureHelper::getMeasureType()) { - case AnnotationActorType::DeleteSelectedAnn: - if (curV != nullptr) { - curV->deleteSelectedMeasure(); - } - break; - case AnnotationActorType::DeleteSliceAnn: - if (curV != nullptr) { - curV->deleteCurrentSliceMeasure(); - } - break; - case AnnotationActorType::DeleteSeriesAnn: - if (curV != nullptr) { - curV->deleteCurrentSeriesMeasure(); - } - break; - default: - ui->viewContainer->getViewManager()->activeMeasure(); - break; - } + connect(ui->toolBar, &QToolBar::visibilityChanged, + this, &QDicomViewer::Slot_ToolbarVisibilityChanged); } //视窗操作,播放相关 -void QDicomViewer::SetupCineTool() { +void QDicomViewer::initCine() { connect(ui->toolBar, &DefaultToolBar::cine, this, [&] { DicomImageView *curV = ui->viewContainer->getCurrentView(); if (curV->hasSeries()) { @@ -241,15 +114,14 @@ void QDicomViewer::createVCRToolbar(DicomImageView *v) { v->setVCRToolbar(vcr_toolbar); } -//视窗操作,fusion相关 -void QDicomViewer::SetupFusionTool() { - connect(ui->toolBar, &DefaultToolBar::fusion, ui->viewContainer->getViewManager(), &ImageViewManager::switchFusion); -} - //视窗操作,wwwl -void QDicomViewer::SetupAdjustTool() { - connect(ui->toolBar, &DefaultToolBar::modeChanged, ui->viewContainer->getViewManager(), &ImageViewManager::setInteractionMode); - +void QDicomViewer::initViewOperation() { + // operation mode change + connect(ui->toolBar, &DefaultToolBar::modeChanged, [=](int mode) { + printf("mode:%d\r\n",mode); + ui->viewContainer->getViewManager()->setInteractionMode(mode); + }); + // custom window level connect(ui->toolBar, &DefaultToolBar::customWindow, [=]() { if (nullptr == m_customwin) { m_customwin = new Customwindow(this); @@ -259,24 +131,17 @@ void QDicomViewer::SetupAdjustTool() { m_customwin->setModal(true); m_customwin->exec(); }); - + // negative window connect(ui->toolBar, &DefaultToolBar::negativeWindow, [=]() { DicomImageView *curV = ui->viewContainer->getViewManager()->getCurrentView(); if (curV != nullptr && curV->hasSeries()) { curV->negativeWindow(); } }); - -} - -//视窗操作,clear -void QDicomViewer::SetupEmptyTool() { - connect(ui->toolBar, &DefaultToolBar::clear, - ui->viewContainer->getViewManager(), &ImageViewManager::clearCurrentView); -} - -//视窗操作,flip and rotation -void QDicomViewer::SetupTransformTool() { + // fusion + connect(ui->toolBar, &DefaultToolBar::fusion, + ui->viewContainer->getViewManager(), &ImageViewManager::switchFusion); + // transform connect(ui->toolBar, &DefaultToolBar::transform,[=](TransFormType type){ DicomImageView *curV = ui->viewContainer->getCurrentView(); if (curV != nullptr && curV->hasSeries()) { @@ -304,50 +169,14 @@ void QDicomViewer::SetupTransformTool() { } } }); -} - -//视窗操作,sync mode -void QDicomViewer::SetupSyncTool() { - connect(EventsCenter::Default(), &EventsCenter::SyncStateChanged, this, &QDicomViewer::syncStateChanged); -} - -void QDicomViewer::syncStateChanged() const { - if (!syncBtn) return; - switch (SyncHelper::getSyncState()) { - case AUTO_SYNC: -// syncBtn->setIcon(mAutoIcon); - m_sync_state_action->setText(QString(tr("CUR STATE: %1")).arg(SyncHelper::SyncStateName[AUTO_SYNC])); - for (int i = 0; i < SYNC_ITEM_NUM; i++) { - m_sync_item_action[i]->setDisabled(false); - } - m_sync_item_action[SLICE_POS]->setChecked(SyncHelper::getSyncItem(SLICE_POS)); - m_sync_item_action[WIDTH_LEVEL]->setChecked(SyncHelper::getSyncItem(WIDTH_LEVEL)); - m_sync_item_action[ZOOM_PAN]->setChecked(SyncHelper::getSyncItem(ZOOM_PAN)); - break; - - case MANUAL_SYNC:{ -// syncBtn->setIcon(mManualIcon); - m_sync_state_action->setText(QString(tr("CUR STATE: %1")).arg(SyncHelper::SyncStateName[MANUAL_SYNC])); - m_sync_item_action[SLICE_POS]->setChecked(SyncHelper::getSyncItem(SLICE_POS)); - m_sync_item_action[WIDTH_LEVEL]->setChecked(SyncHelper::getSyncItem(WIDTH_LEVEL)); - m_sync_item_action[ZOOM_PAN]->setChecked(SyncHelper::getSyncItem(ZOOM_PAN)); - break; - } - case DIS_SYNC: -// syncBtn->setIcon(mDisIcon); - m_sync_state_action->setText(QString(tr("CUR STATE: %1")).arg(SyncHelper::SyncStateName[DIS_SYNC])); - for (int i = 0; i < SYNC_ITEM_NUM; i++) { - m_sync_item_action[i]->setChecked(false); - m_sync_item_action[i]->setDisabled(true); - } - break; - default: - break; - } + // MPR + connect(ui->toolBar, &DefaultToolBar::changeSliceOrientation, + ui->viewContainer->getViewManager(), &ImageViewManager::switchSliceOrientation); } //视窗操作?,file open相关 -void QDicomViewer::SetupFileTool() { +void QDicomViewer::initGeneralTool() { + // open dir connect(ui->toolBar,&DefaultToolBar::openFolder, [&] { QString p = QFileDialog::getExistingDirectory(this, tr("Open dicom directory"), m_qs.value("DIR_PATH_ID").toString()); @@ -356,20 +185,15 @@ void QDicomViewer::SetupFileTool() { openDICOM(p.toLocal8Bit().toStdString(), DIR_OPEN_MODE); } }); - + // openfile connect(ui->toolBar,&DefaultToolBar::openFile, [&] { - //QSettings s; - //QString p = s.value(FILE_PATH_ID).toString(); QString fn = QFileDialog::getOpenFileName(this, tr("Open dicom files"), m_qs.value("FILE_PATH_ID").toString()); if (!fn.isEmpty()) { m_qs.setValue("FILE_PATH_ID", fn); openDICOM(fn.toLocal8Bit().toStdString(), FILE_OPEN_MODE); } }); -} - -void QDicomViewer::SetupImportTool() { - + // import connect(ui->toolBar, &DefaultToolBar::import, this, [&] { if (nullptr == m_import) { m_import = new ImportWidget(this); @@ -377,10 +201,7 @@ void QDicomViewer::SetupImportTool() { } m_import->show(); }); -} - -void QDicomViewer::SetupExportTool() { - + // export connect(ui->toolBar, &DefaultToolBar::save, this, [=] { if (nullptr == exportDialog) { exportDialog = new ExportDialog(this); @@ -389,16 +210,14 @@ void QDicomViewer::SetupExportTool() { } exportDialog->show(); }); -} - -void QDicomViewer::displayThumbnailBar(bool value) { -// VCRHelper::setThumbnailbar(value); -// ui->thumbnailBar->setVisible(value); -// m_preview_display_action->setChecked(value); -} - -void QDicomViewer::SetupGridTool() { - // connect + // open meta dialog + connect(ui->toolBar,&DefaultToolBar::showMeta, this, [&] { + DicomImageView *curV = ui->viewContainer->getCurrentView(); + if (curV->hasSeries()) { + curV->showMetaData(); + } + }); + // layout connect(ui->toolBar, &DefaultToolBar::showGrid, this, [=](QToolButton* btn) { // auto delete while hidden GridPopWidget *gpw = new GridPopWidget(btn); @@ -407,20 +226,19 @@ void QDicomViewer::SetupGridTool() { gpw->move(this->geometry().topLeft() + btn->geometry().bottomLeft() + QPoint(5, 5)); gpw->show(); }); + // clear view window + connect(ui->toolBar, &DefaultToolBar::clear, + ui->viewContainer->getViewManager(), &ImageViewManager::clearCurrentView); } -void QDicomViewer::SetupConnections() { - //通知左侧的缩略图bar ,当前选中series的变换 - connect(ui->viewContainer, &ViewContainerWidget::onThumbnailTrigger, - ui->thumbnailBar, &ThumbnailBarWidget::Slot_setCurrentThumbnail); - - //通知右侧显示区域,当前有series被点击 - connect(ui->thumbnailBar, &ThumbnailBarWidget::Signal_ThumbClicked, - ui->viewContainer->getViewManager(), &ImageViewManager::viewReload); - - connect(ui->toolBar, &QToolBar::visibilityChanged, - this, &QDicomViewer::Slot_ToolbarVisibilityChanged); +void QDicomViewer::displayThumbnailBar(bool value) { + VCRHelper::setThumbnailbar(value); + ui->thumbnailBar->setVisible(value); +} +void QDicomViewer::initScreenControl() { + connect(ui->toolBar,&DefaultToolBar::parentWindowStateChange,this,&QDicomViewer::setWindowState); + connect(ui->toolBar,&DefaultToolBar::parentWindowClose, this, &QWidget::close); } void QDicomViewer::Slot_ToolbarVisibilityChanged(bool visible) { @@ -455,10 +273,9 @@ void QDicomViewer::openDICOM(const std::string &dicomName, SeriesOpenMode openMo void QDicomViewer::resetToolBarButtons(ViewFunctionState state) { - fusionBtn->setEnabled(state.canFusion); - mprBtn->setEnabled(state.canMPR); +// fusionBtn->setEnabled(state.canFusion); +// mprBtn->setEnabled(state.canMPR); SyncHelper::setSyncState(state.canSync?AUTO_SYNC:DIS_SYNC); - syncStateChanged(); } diff --git a/src/src/UI/Window/QDicomViewer.h b/src/src/UI/Window/QDicomViewer.h index 0528f18..54071c6 100644 --- a/src/src/UI/Window/QDicomViewer.h +++ b/src/src/UI/Window/QDicomViewer.h @@ -41,30 +41,18 @@ private: */ void Initial(); - void createToolButton(); - /** * 用于设置ToolButton相关的属性(文字、图标、槽等)的一组函数 * @{ */ - void SetupFileTool(); - void SetupImportTool(); - void SetupExportTool(); - - void SetupGridTool(); - void SetupSyncTool(); - void SetupAnnoTool(); + void initGeneralTool(); - void SetupAdjustTool(); - void SetupMeasureTool(); + void initViewOperation(); - void SetupTransformTool(); - void SetupFusionTool(); - void SetupCineTool(); - void SetupEmptyTool(); + void initCine(); - void SetupScreenTool(); + void initScreenControl(); //@} /** @@ -86,38 +74,21 @@ private: */ void SetupConnections(); - /** - * 按照annType的类型,在Container中执行对应的Measurement操作 - */ - void executeActiveMeasure(); - /** - * 为对应的DicomImageView构建对应的播放控件 - * @param v - */ + * 为对应的DicomImageView构建对应的播放控件 + * @param v + */ void createVCRToolbar(DicomImageView *v); void resetToolBarButtons(ViewFunctionState state); - QToolButton* syncBtn = nullptr; - QToolButton* fusionBtn = nullptr; - QToolButton* mprBtn = nullptr; - QAction *m_sync_item_action[SYNC_ITEM_NUM]; - QAction* m_sync_state_action; - QAction* m_measure_hidden_action; - QAction* m_patient_hidden_action; - ExportDialog *exportDialog = nullptr; ImportWidget *m_import =nullptr; QSettings m_qs; Customwindow *m_customwin =nullptr; - - AnnotationActorType m_cur_measure = AnnotationActorType::RulerAnn; WorkerManager workerManager; ImageViewStateCheckWorker worker; - void syncStateChanged() const; - };