2021-10-09 16:38:34 +08:00
# include "ScanFormWidget.h"
2023-08-21 14:22:41 +08:00
# include "ui_TabFormWidget.h"
2022-06-14 17:15:23 +08:00
2021-10-09 16:38:34 +08:00
# include <QVBoxLayout>
# include <QToolButton>
# include <QButtonGroup>
2021-10-14 14:39:52 +08:00
# include <QPainter>
2022-06-14 17:15:23 +08:00
# include <QLabel>
2023-12-12 10:13:59 +08:00
# include <QTimer>
2024-04-01 16:02:40 +08:00
# include <QKeyEvent>
2021-10-26 09:51:23 +08:00
# include <qdebug.h>
2022-06-14 17:15:23 +08:00
# include "forms/scan/PatientInformationForm.h"
# include "event/EventCenter.h"
2023-09-08 17:09:49 +08:00
# include "dialogs/DialogManager.h"
2021-12-23 10:09:35 +08:00
# include "log/UserOperationLog.h"
2022-05-17 16:16:01 +08:00
# include "json/jsonobject.h"
2023-08-21 14:22:41 +08:00
# include "device/DeviceManager.h"
2024-04-01 16:02:40 +08:00
# include "dicom/WorkListManager.h"
2021-10-09 16:38:34 +08:00
2021-10-19 14:10:58 +08:00
# ifdef WIN32
# else
# include <cmath>
# endif
2022-06-14 17:15:23 +08:00
namespace {
const size_t PREVIEW_ROW = 140 ;
const size_t PREVIEW_COL = 140 ;
const float PIXEL_SPACING = 1.5f ;
const float HALF_ROI_WIDTH = 100.0f ;
2024-04-01 16:02:40 +08:00
const unsigned int DRAINAGE_TIME = 180000 ; //3 minitues
2022-06-14 17:15:23 +08:00
}
2022-06-29 09:56:13 +08:00
ScanFormWidget : : ScanFormWidget ( QWidget * parent )
2024-04-29 17:58:17 +08:00
: TabFormWidget ( parent )
, mPatInf ( new PatientInformationForm ( this ) )
, mAccountButton ( new QToolButton ( this ) )
, mShutdownButton ( new QToolButton ( this ) )
, mWorklistButton ( new QToolButton ( this ) )
, mStartScanButton ( new QToolButton ( this ) )
, mDrainageButton ( new QToolButton ( this ) )
, mXYLabel ( new QLabel ( this ) )
, mZLabel ( new QLabel ( this ) )
, mScanProcessLabel ( new QLabel ( this ) )
, mDrainageTimer ( new QTimer ( this ) )
2022-06-14 17:15:23 +08:00
{
2022-07-12 16:13:09 +08:00
2024-04-29 17:58:17 +08:00
auto commandlayout = new QHBoxLayout ( ui - > commandWidget ) ;
initCommandWidget ( commandlayout ) ;
//initScanControlBar(commandlayout);
2022-06-14 17:15:23 +08:00
initScanContent ( ) ;
2022-06-29 09:56:13 +08:00
initEvents ( ) ;
2023-12-12 10:13:59 +08:00
mDrainageTimer - > setSingleShot ( true ) ;
connect ( mDrainageTimer , & QTimer : : timeout , this , [ this ] ( )
{
2024-04-29 17:58:17 +08:00
mDrainageButton - > click ( ) ;
2023-12-12 10:13:59 +08:00
} ) ;
2021-10-09 16:38:34 +08:00
}
2024-04-29 17:58:17 +08:00
void ScanFormWidget : : initCommandWidget ( QHBoxLayout * layout )
{
bool anonymousMode = JsonObject : : Instance ( ) - > getAnonymousMode ( ) ;
mAccountButton - > setObjectName ( " btnAccount " ) ;
mAccountButton - > setText ( tr ( " Account " ) ) ;
layout - > addWidget ( mAccountButton ) ;
2022-06-14 17:15:23 +08:00
2024-04-29 17:58:17 +08:00
mShutdownButton - > setObjectName ( " btnShutDown " ) ;
mShutdownButton - > setText ( tr ( " ShutDown " ) ) ;
layout - > addWidget ( mShutdownButton ) ;
2022-06-14 17:15:23 +08:00
2024-04-29 17:58:17 +08:00
mWorklistButton - > setObjectName ( " btnWorklist " ) ;
mWorklistButton - > setText ( tr ( " Worklist " ) ) ;
mWorklistButton - > setEnabled ( ! anonymousMode ) ;
layout - > addWidget ( mWorklistButton ) ;
2022-06-14 17:15:23 +08:00
2024-04-29 17:58:17 +08:00
mStartScanButton - > setObjectName ( " btnScan " ) ;
mStartScanButton - > setText ( tr ( " Start Scan " ) ) ;
layout - > addWidget ( mStartScanButton ) ;
layout - > addSpacerItem ( new QSpacerItem ( 20 , 20 , QSizePolicy : : Expanding ) ) ;
addVerticalLine ( layout ) ;
mDrainageButton - > setObjectName ( " btnDrainage " ) ;
mDrainageButton - > setCheckable ( true ) ;
mDrainageButton - > setText ( tr ( " Drainage " ) ) ;
layout - > addWidget ( mDrainageButton ) ;
connect ( mDrainageButton , & QToolButton : : clicked , [ = ] ( bool aSatus )
2023-09-05 14:27:30 +08:00
{
2024-04-29 17:58:17 +08:00
//Drainage
if ( aSatus & & DialogManager : : Default ( ) - > requestAlertMessage ( tr ( " Make sure to open the drain valve ? " ) , DialogButtonMode : : OkAndCancel , tr ( " Confirm Drainage " ) ) = = QDialog : : Rejected )
2023-09-05 14:27:30 +08:00
{
2024-04-29 17:58:17 +08:00
mDrainageButton - > setChecked ( ! aSatus ) ;
return ;
}
mDrainageButton - > setEnabled ( false ) ;
if ( aSatus = = true )
{
mDrainageTimer - > start ( DRAINAGE_TIME ) ;
QString code = " 1 " ;
mDrainageButton - > setText ( tr ( " Drainaging " ) ) ;
EventCenter : : Default ( ) - > triggerEvent ( RequestDrainage , nullptr , ( QObject * ) ( & code ) ) ;
LOG_USER_OPERATION ( " Perform Drainage " ) ;
}
else
{
mDrainageTimer - > stop ( ) ;
QString code = " 0 " ;
mDrainageButton - > setText ( tr ( " Drainage " ) ) ;
EventCenter : : Default ( ) - > triggerEvent ( RequestDrainage , nullptr , ( QObject * ) ( & code ) ) ;
LOG_USER_OPERATION ( " Stop Drainage " ) ;
2023-09-05 14:27:30 +08:00
}
} ) ;
2024-04-29 17:58:17 +08:00
2023-09-05 14:27:30 +08:00
connect ( DeviceManager : : Default ( ) , & DeviceManager : : startPumpControlResult , [ this ] ( bool aIsSucessful )
{
2024-04-29 17:58:17 +08:00
mDrainageButton - > setEnabled ( true ) ;
2023-09-05 14:27:30 +08:00
if ( ! aIsSucessful )
{
2023-12-12 10:13:59 +08:00
mDrainageTimer - > stop ( ) ;
2024-04-29 17:58:17 +08:00
bool isChecked = mDrainageButton - > isChecked ( ) ;
mDrainageButton - > setChecked ( ! isChecked ) ;
2023-09-05 14:27:30 +08:00
if ( isChecked )
{
2024-04-29 17:58:17 +08:00
mDrainageButton - > setText ( tr ( " Drainage " ) ) ;
2023-09-05 14:27:30 +08:00
}
else
{
2024-04-29 17:58:17 +08:00
mDrainageButton - > setText ( tr ( " Drainaging " ) ) ;
2023-09-05 14:27:30 +08:00
}
}
} ) ;
2024-04-29 17:58:17 +08:00
connect ( mAccountButton , & QToolButton : : clicked , DialogManager : : Default ( ) , & DialogManager : : requestEditSelfAccount ) ;
connect ( mShutdownButton , & QToolButton : : clicked , [ ] ( )
{
if ( DialogManager : : Default ( ) - > requestAlertMessage ( QString ( tr ( " Shut down now ? " ) ) , DialogButtonMode : : OkAndCancel , tr ( " Shut Down " ) ) = = QDialog : : Accepted )
2023-09-08 17:09:49 +08:00
{
2024-04-29 17:58:17 +08:00
LOG_USER_OPERATION ( " Shut Down " )
EventCenter : : Default ( ) - > triggerEvent ( GUIEvents : : RequestShutdown , nullptr , nullptr ) ;
2022-06-14 17:15:23 +08:00
}
} ) ;
2024-04-29 17:58:17 +08:00
connect ( mWorklistButton , & QToolButton : : clicked , [ & ] ( )
{
DialogManager : : Default ( ) - > requestGetWorkList ( ) ;
2022-06-14 17:15:23 +08:00
} ) ;
2024-04-29 17:58:17 +08:00
connect ( EventCenter : : Default ( ) , & EventCenter : : AnonymousModeChanged , this , & ScanFormWidget : : updateDataByAnonymousMode ) ;
// auto group = new QButtonGroup(ui->commandWidget);
// mBtnLeft->setCheckable(true);
// mBtnLeft->setChecked(true);
// mBtnRight->setCheckable(true);
// group->addButton(mBtnRight, 1);
// group->addButton(mBtnLeft, 0);
// connect(group, SIGNAL(buttonClicked(int)), this, SLOT(protocolChanged(int)));
}
void ScanFormWidget : : initScanContent ( )
{
QHBoxLayout * contentLayout = new QHBoxLayout ( ui - > contentWidget ) ;
contentLayout - > addWidget ( mPatInf ) ;
QWidget * scanProcessWidget = new QWidget ( this ) ;
scanProcessWidget - > setObjectName ( " ScanProcessWidget " ) ;
contentLayout - > addWidget ( scanProcessWidget ) ;
QVBoxLayout * scanProcessLayout = new QVBoxLayout ( scanProcessWidget ) ;
mScanProcessLabel - > setSizePolicy ( QSizePolicy : : Expanding , QSizePolicy : : Fixed ) ;
mScanProcessLabel - > setAlignment ( Qt : : AlignCenter ) ;
mScanProcessLabel - > setObjectName ( " ScanProcessInformation " ) ;
mScanProcessLabel - > setText ( tr ( " Please confirm checking patient information to start the process " ) ) ;
scanProcessLayout - > addWidget ( mScanProcessLabel ) ;
QWidget * displayWidget = new QWidget ( this ) ;
scanProcessLayout - > addWidget ( displayWidget ) ;
QHBoxLayout * displayLayout = new QHBoxLayout ( displayWidget ) ;
QWidget * xyWidget = new QWidget ( this ) ;
xyWidget - > setObjectName ( " broadcastWidget " ) ;
QHBoxLayout * xyLayout = new QHBoxLayout ( xyWidget ) ;
xyLayout - > addWidget ( mXYLabel ) ;
displayLayout - > addWidget ( xyWidget ) ;
QWidget * zWidget = new QWidget ( this ) ;
zWidget - > setObjectName ( " broadcastWidget " ) ;
QHBoxLayout * zLayout = new QHBoxLayout ( zWidget ) ;
zLayout - > addWidget ( mZLabel ) ;
displayLayout - > addWidget ( zWidget ) ;
}
void ScanFormWidget : : initScanControlBar ( QHBoxLayout * layout )
{
// connect(mBtnEScan, &QToolButton::clicked, [=]() {
// int result = DialogManager::Default()->requestAlertMessage(tr("Please make sure the holder is only contain water!"),DialogButtonMode::OkAndCancel,tr("Confirm Scan"));
// if (result != QDialog::Accepted)return;
// QString patientInf(mPatInf->getCurrentPatientJsonString(true));
// LOG_USER_OPERATION("Start Empty Scan")
// EventCenter::Default()->triggerEvent(RequestEmptyScan, nullptr, (QObject*)(&patientInf));
// });
// connect(mBtnPreview, &QToolButton::clicked, [=]() {
// LOG_USER_OPERATION(QString("Start Preview, ID: %1").arg(mPatInf->getPatientID()))
// EventCenter::Default()->triggerEvent(RequestPreviewScan, nullptr, nullptr);
// });
connect ( DeviceManager : : Default ( ) , & DeviceManager : : startPreviewScanResult , [ this ] ( bool aIsSucessful )
{
if ( ! aIsSucessful )
2023-03-28 14:10:32 +08:00
{
2024-04-29 17:58:17 +08:00
setPreviewing ( false ) ;
2023-03-28 14:10:32 +08:00
}
} ) ;
2024-04-29 17:58:17 +08:00
// connect(mBtnScan, &QToolButton::clicked, [=]() {
// if(JsonObject::Instance()->getScanConfirm())
// {
// int ret = DialogManager::Default()->requestPatientConfirm(mPatInf->getPatientInformation(),mPatInf->getProtocol());
// if (ret != QDialog::Accepted) return;
// }
// QString patientInf(mPatInf->getCurrentPatientJsonString(false));
// LOG_USER_OPERATION(QString("Start Scan, ID: %1").arg(mPatInf->getPatientID()))
// if (!DeviceManager::Default()->hasValidEmptyScan()){
// QString msg(tr("No refresh data exists, please do Refresh operation first."));
// EventCenter::Default()->triggerEvent(DeviceErrorRaise, nullptr, (QObject*)(&msg));
// return;
// }
// EventCenter::Default()->triggerEvent(RequestPatientScan, nullptr, (QObject*)(&patientInf));
// });
// connect(mBtnStop, &QToolButton::clicked, [=]() {
// LOG_USER_OPERATION("Stop Preview")
// EventCenter::Default()->triggerEvent(RequestPreviewStop, nullptr, nullptr);
// });
2021-10-09 16:38:34 +08:00
}
2021-10-12 17:43:12 +08:00
2024-04-29 17:58:17 +08:00
void ScanFormWidget : : protocolChanged ( int type )
{
2023-09-05 14:27:30 +08:00
LOG_USER_OPERATION ( QString ( " Select Laterality %1 " ) . arg ( type = = 0 ? " Left " : " Right " ) ) ;
2021-10-12 17:43:12 +08:00
}
2021-10-13 17:36:38 +08:00
2024-04-29 17:58:17 +08:00
void ScanFormWidget : : setPreviewing ( bool val )
{
// mBtnPreview->setCheckable(val);
// mBtnPreview->setChecked(val);
// mBtnPreview->setEnabled(!val);
// mBtnEScan->setEnabled(!val);
// mBtnScan->setEnabled(!val);
mDrainageButton - > setEnabled ( ! val ) ;
2023-09-25 10:56:25 +08:00
2022-06-14 17:15:23 +08:00
}
2024-04-29 17:58:17 +08:00
void ScanFormWidget : : renderLoading ( )
{
2022-06-14 17:15:23 +08:00
setPreviewing ( true ) ;
2023-09-25 10:56:25 +08:00
2022-06-14 17:15:23 +08:00
uchar c_data [ PREVIEW_ROW ] [ PREVIEW_COL ] ;
2022-07-14 09:57:05 +08:00
for ( auto data_ptr : c_data ) {
2022-06-14 17:15:23 +08:00
memset ( data_ptr , 0 , PREVIEW_COL ) ;
}
QImage img ( c_data [ 0 ] , PREVIEW_COL , PREVIEW_ROW , QImage : : Format_Grayscale8 ) ;
QPixmap pic = QPixmap : : fromImage ( img ) . scaledToHeight ( 800 , Qt : : SmoothTransformation ) ;
QPainter painter ( & pic ) ;
QPen pen ;
pen . setStyle ( Qt : : DashLine ) ;
pen . setWidth ( 3 ) ;
QFont font ( " Futura " ) ;
font . setPixelSize ( 26 ) ;
font . setBold ( true ) ;
painter . setFont ( font ) ;
pen . setColor ( QColor ( 255 , 255 , 0 ) ) ;
painter . setPen ( pen ) ;
painter . drawText ( 400 - 13 * 5 , 400 + 13 , " Loading... " ) ;
}
2024-04-29 17:58:17 +08:00
void ScanFormWidget : : renderPreviewData ( const QObject * /*sender*/ , const QObject * data )
{
2022-06-14 17:15:23 +08:00
if ( ! data ) return ;
2022-06-29 09:56:13 +08:00
auto array = ( QByteArray * ) data ;
auto raw_dataptr = ( uchar * ) array - > data ( ) ;
2022-06-14 17:15:23 +08:00
uchar c_data [ PREVIEW_ROW ] [ PREVIEW_COL ] ;
2022-07-14 09:57:05 +08:00
for ( auto data_ptr : c_data ) {
2022-06-14 17:15:23 +08:00
memcpy ( data_ptr , raw_dataptr , PREVIEW_COL ) ;
raw_dataptr + = PREVIEW_COL ;
}
QImage img ( c_data [ 0 ] , PREVIEW_COL , PREVIEW_ROW , QImage : : Format_Grayscale8 ) ;
QPixmap pic = QPixmap : : fromImage ( img ) . scaledToHeight ( 800 , Qt : : SmoothTransformation ) ;
QPainter painter ( & pic ) ;
QPen pen ;
pen . setColor ( QColor ( 255 , 255 , 0 , 100 ) ) ;
pen . setStyle ( Qt : : DashLine ) ;
pen . setWidth ( 3 ) ;
QFont font ( " Futura " ) ;
font . setPixelSize ( 26 ) ;
font . setBold ( true ) ;
painter . setFont ( font ) ;
painter . setPen ( pen ) ;
2022-07-14 09:57:05 +08:00
static int borderSpacing = ( int ) roundf ( ( ( PIXEL_SPACING * ( PREVIEW_ROW * 0.5f ) - HALF_ROI_WIDTH ) * ( 800.0f / ( 1.5f * 140.0f ) ) ) ) ;
2022-06-14 17:15:23 +08:00
painter . drawLine ( borderSpacing , borderSpacing , borderSpacing , 800 - borderSpacing ) ;
painter . drawLine ( borderSpacing + 1 , borderSpacing , 800 - borderSpacing , borderSpacing ) ;
painter . drawLine ( borderSpacing + 1 , 800 - borderSpacing , 800 - borderSpacing , 800 - borderSpacing ) ;
painter . drawLine ( 800 - borderSpacing , borderSpacing + 1 , 800 - borderSpacing , 800 - borderSpacing - 1 ) ;
pen . setColor ( QColor ( 255 , 255 , 0 ) ) ;
painter . setPen ( pen ) ;
painter . drawText ( 335 , 40 , QString ( " Previewing, current frame:%1 " ) . arg ( + + mCurrentFrame ) ) ;
painter . drawText ( borderSpacing + 13 , 400 + 13 , " L " ) ;
painter . drawText ( 800 - borderSpacing - 30 , 400 + 13 , " R " ) ;
painter . drawText ( 400 - 13 , borderSpacing + 30 , " H " ) ;
painter . drawText ( 400 - 13 , 800 - borderSpacing - 13 , " F " ) ;
painter . drawText ( borderSpacing + 6 , borderSpacing + 30 , " ROI " ) ;
2022-06-29 09:56:13 +08:00
}
2024-04-29 17:58:17 +08:00
void ScanFormWidget : : initEvents ( )
{
//Events---------------------------------------------------------------
2022-06-29 09:56:13 +08:00
connect ( EventCenter : : Default ( ) , & EventCenter : : PatientSelected , [ = ] ( QObject * sender , QObject * data ) {
2023-09-15 11:42:40 +08:00
if ( data )
2022-06-29 09:56:13 +08:00
{
2024-04-29 17:58:17 +08:00
PatientInformation * patientInfo = ( PatientInformation * ) data ;
DialogResult result = DialogManager : : Default ( ) - > reuqestConfirmStartScan ( patientInfo ) ;
if ( result . ResultCode = = QDialog : : Accepted )
{
mPatInf - > setPatientInformation ( patientInfo - > Copy ( ) ) ;
}
// mBtnScan->setEnabled(true);
// mBtnEScan->setEnabled(true);
// mBtnPreview->setEnabled(true);
// mBtnStop->setEnabled(true);
2023-09-15 11:42:40 +08:00
}
else {
2024-04-29 17:58:17 +08:00
// mBtnScan->setEnabled(false);
// mBtnEScan->setEnabled(false);
// mBtnPreview->setEnabled(false);
// mBtnStop->setEnabled(false);
2022-06-29 09:56:13 +08:00
}
} ) ;
2023-08-21 14:22:41 +08:00
connect ( EventCenter : : Default ( ) , & EventCenter : : ResponseStopPreview , [ = ] ( QObject * sender , QObject * data ) {
2022-06-29 09:56:13 +08:00
setPreviewing ( false ) ;
} ) ;
connect ( EventCenter : : Default ( ) , & EventCenter : : ResponsePreview , this , & ScanFormWidget : : renderLoading ) ;
connect ( EventCenter : : Default ( ) , & EventCenter : : ResponsePreviewData , this , & ScanFormWidget : : renderPreviewData ) ;
connect ( EventCenter : : Default ( ) , & EventCenter : : ReloadLanguage , this , & ScanFormWidget : : reloadLanguage ) ;
connect ( EventCenter : : Default ( ) , & EventCenter : : DeviceErrorRaise , [ = ] ( QObject * parent , QObject * msg ) {
printf ( " signal:%d \r \n " , senderSignalIndex ( ) ) ;
} ) ;
2022-06-14 17:15:23 +08:00
}
2024-04-29 17:58:17 +08:00
void ScanFormWidget : : reloadLanguage ( )
{
mAccountButton - > setText ( tr ( " Account " ) ) ;
mShutdownButton - > setText ( tr ( " ShutDown " ) ) ;
mWorklistButton - > setText ( tr ( " Worklist " ) ) ;
mStartScanButton - > setText ( tr ( " Start Scan " ) ) ;
mDrainageButton - > isChecked ( ) ? mDrainageButton - > setText ( tr ( " Drainaging " ) ) : mDrainageButton - > setText ( tr ( " Drainage " ) ) ;
}
void ScanFormWidget : : updateDataByAnonymousMode ( )
{
bool anonymousMode = JsonObject : : Instance ( ) - > getAnonymousMode ( ) ;
mWorklistButton - > setEnabled ( ! anonymousMode ) ;
2021-10-13 17:36:38 +08:00
}
2024-04-01 16:02:40 +08:00
void ScanFormWidget : : keyPressEvent ( QKeyEvent * aEvent )
{
switch ( aEvent - > key ( ) )
{
case Qt : : Key_0 :
case Qt : : Key_1 :
case Qt : : Key_2 :
case Qt : : Key_3 :
case Qt : : Key_4 :
case Qt : : Key_5 :
case Qt : : Key_6 :
case Qt : : Key_7 :
case Qt : : Key_8 :
case Qt : : Key_9 :
case Qt : : Key_A :
case Qt : : Key_B :
case Qt : : Key_C :
case Qt : : Key_D :
case Qt : : Key_E :
case Qt : : Key_F :
case Qt : : Key_G :
case Qt : : Key_H :
case Qt : : Key_I :
case Qt : : Key_J :
case Qt : : Key_K :
case Qt : : Key_L :
case Qt : : Key_M :
case Qt : : Key_N :
case Qt : : Key_O :
case Qt : : Key_P :
case Qt : : Key_Q :
case Qt : : Key_R :
case Qt : : Key_S :
case Qt : : Key_T :
case Qt : : Key_U :
case Qt : : Key_V :
case Qt : : Key_W :
case Qt : : Key_X :
case Qt : : Key_Y :
case Qt : : Key_Z :
{
WorkListManager : : getInstance ( ) - > setSearchString ( aEvent - > text ( ) ) ;
break ;
}
case Qt : : Key_Enter :
case Qt : : Key_Return :
{
QString text = WorkListManager : : getInstance ( ) - > getSearchString ( ) ;
EventCenter : : Default ( ) - > triggerEvent ( InputWorkListSearchValue , nullptr , ( QObject * ) & text ) ;
break ;
}
default :
break ;
}
QWidget : : keyPressEvent ( aEvent ) ;
}