Refactor QDicomViewer, extract toolbar DefaultToolBar class, refactor state -> button ready, need add state check.
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -5,14 +5,20 @@
|
||||
#ifndef OMEGAV_EVENTSCENTER_H
|
||||
#define OMEGAV_EVENTSCENTER_H
|
||||
|
||||
#include <QtCore/QObject>
|
||||
#include "QtCore/qmap.h"
|
||||
#include "QString"
|
||||
#include <QObject>
|
||||
#include <QMap>
|
||||
#include <QString>
|
||||
#include <QVariant>
|
||||
|
||||
#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<QString,void*> Detail;
|
||||
void AddDetailValue(const QString& key, void* val)
|
||||
QMap<QString,QVariant> Detail;
|
||||
void AddDetailValue(const QString& key, QVariant val)
|
||||
{
|
||||
Detail[key]=val;
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ Measure* GetNextMeasure() override\
|
||||
|
||||
|
||||
#include <QString>
|
||||
#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() {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -84,6 +84,8 @@ public:
|
||||
|
||||
void activeMeasure();
|
||||
|
||||
void deleteMeasure(EventObject* deleteType);
|
||||
|
||||
void switchSliceOrientation();
|
||||
|
||||
void updateCornerInfoAll();
|
||||
|
||||
@@ -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, [=] {
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user