// // Created by Krad on 2021/10/8. // #include "ScanFormWidget.h" #include "ui_tabformwidget.h" #include #include #include #include #include #include #include "forms/scan/PatientInformationForm.h" #include "event/EventCenter.h" #include "log/UserOperationLog.h" #include "json/jsonobject.h" #ifdef WIN32 #else #include #endif 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; } ScanFormWidget::ScanFormWidget(QWidget* parent) : TabFormWidget(parent) , mPatInf(new PatientInformationForm(this)) , mLblProtocol(new QLabel(this)) , mBtnLeft(new QToolButton(this)) , mBtnRight(new QToolButton(this)) , mBtnRefresh(new QToolButton(this)) , mBtnPreview(new QToolButton(this)) , mBtnStop(new QToolButton(this)) , mBtnScan(new QToolButton(this)) , mViewer(new QLabel(this)) , mLblPreview(new QLabel(this)) , mLblE(new QLabel(this)) , mLblParams(new QLabel(this)) , mLblE2(new QLabel(this)) { auto layout = new QHBoxLayout(ui->commandWidget); initProtocolUI(layout); layout->addSpacerItem(new QSpacerItem(20, 20, QSizePolicy::Expanding)); addVerticalLine(layout); initScanControlBar(layout); initScanContent(); initEvents(); } void ScanFormWidget::initProtocolUI(QHBoxLayout *layout) { mLblProtocol->setText(tr("Protocol")); mLblProtocol->setAlignment(Qt::AlignTop); mLblProtocol->setObjectName("protocolPanelTitle"); layout->addWidget(mLblProtocol); addVerticalLine(layout); mBtnLeft->setObjectName("btnLeft"); mBtnRight->setObjectName("btnRight"); mBtnLeft->setText(tr("LEFT")); mBtnRight->setText(tr("RIGHT")); layout->addWidget(mBtnLeft); layout->addWidget(mBtnRight); 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() { auto contentLayout = new QHBoxLayout(); ui->contentWidget->setLayout(contentLayout); contentLayout->addWidget(mPatInf); auto paramWidget = new QWidget(this); auto broadcastWidget = new QWidget(this); broadcastWidget->setObjectName("broadcastWidget"); mViewer->setObjectName("viewer"); mViewer->setFixedSize(800, 800); mViewer->setText(""); auto viewerLayout = new QHBoxLayout(mViewer); broadcastWidget->setLayout(viewerLayout); viewerLayout->addWidget(mViewer); contentLayout->addWidget(broadcastWidget); paramWidget->setObjectName("paramWidget"); auto paramLayout = new QVBoxLayout(paramWidget); mLblPreview->setText(tr("Preview Parameters")); mLblPreview->setObjectName("parameterTitle"); paramLayout->addWidget(mLblPreview); mLblE->setWordWrap(true); mLblE->setObjectName("placeholder"); mLblE->setText(tr("some settings\n\nparameters\n")); paramLayout->addWidget(mLblE); auto lbl_end = new QLabel(this); lbl_end->setObjectName("endSpaceLine"); paramLayout->addWidget(lbl_end); mLblParams->setText(tr("Scan Parameters")); mLblParams->setObjectName("parameterTitle"); paramLayout->addWidget(mLblParams); mLblE2->setWordWrap(true); mLblE2->setObjectName("placeholder"); mLblE2->setText(tr("some settings\n\nparameters\n")); paramLayout->addWidget(mLblE2); auto lbl_end2 = new QLabel(this); lbl_end2->setObjectName("endSpaceLine"); paramLayout->addWidget(lbl_end2); paramLayout->addSpacerItem(new QSpacerItem(20, 20, QSizePolicy::Minimum, QSizePolicy::Expanding)); contentLayout->addWidget(paramWidget); } void ScanFormWidget::initScanControlBar(QHBoxLayout *layout){ mBtnRefresh->setObjectName("btnRefresh"); mBtnPreview->setObjectName("btnPreview"); mBtnStop->setObjectName("btnStop"); mBtnScan->setObjectName("btnScan"); mBtnRefresh->setText(tr("Refresh")); mBtnPreview->setText(tr("Preview")); mBtnStop->setText(tr("Stop")); mBtnScan->setText(tr("Scan")); mBtnScan->setEnabled(false); mBtnRefresh->setEnabled(false); mBtnPreview->setEnabled(false); mBtnStop->setEnabled(false); layout->addWidget(mBtnRefresh); layout->addWidget(mBtnPreview); layout->addWidget(mBtnStop); layout->addWidget(mBtnScan); connect(mBtnRefresh, &QToolButton::clicked, [=]() { QString patientInf(mPatInf->getCurrentPatientJsonString(true)); LOG_USER_OPERATION(StartRefresh) EventCenter::Default()->triggerEvent(RequestEmptyScan, nullptr, (QObject*)(&patientInf)); }); connect(mBtnPreview, &QToolButton::clicked, [=]() { LOG_USER_OPERATION(StartPreview) EventCenter::Default()->triggerEvent(RequestPreviewScan, nullptr, nullptr); }); connect(mBtnScan, &QToolButton::clicked, [=]() { QString patientInf(mPatInf->getCurrentPatientJsonString(false)); LOG_USER_OPERATION(StartScan) if (!JsonObject::Instance()->getEmptyScanID()){ 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) EventCenter::Default()->triggerEvent(RequestStop, nullptr, nullptr); }); } void ScanFormWidget::protocolChanged(int type) { printf("%d\r\n", type); mPatInf->setProtocol(type); } void ScanFormWidget::setPreviewing(bool val) { mViewer->setVisible(val); mBtnPreview->setCheckable(val); mBtnPreview->setChecked(val); mBtnPreview->setEnabled(!val); mBtnRefresh->setEnabled(!val); mBtnScan->setEnabled(!val); } void ScanFormWidget::renderLoading() { setPreviewing(true); uchar c_data[PREVIEW_ROW][PREVIEW_COL]; for (auto data_ptr : c_data) { memset(data_ptr, 0, PREVIEW_COL); } QImage img(c_data[0], PREVIEW_COL, PREVIEW_ROW, QImage::Format_Grayscale8); mViewer->setFixedSize(800, 800); 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..."); mViewer->setPixmap(pic); } void ScanFormWidget::renderPreviewData(const QObject *data) { if (!data)return; auto array = (QByteArray*)data; auto raw_dataptr = (uchar*)array->data(); uchar c_data[PREVIEW_ROW][PREVIEW_COL]; for (auto data_ptr : c_data) { memcpy(data_ptr, raw_dataptr, PREVIEW_COL); raw_dataptr += PREVIEW_COL; } QImage img(c_data[0], PREVIEW_COL, PREVIEW_ROW, QImage::Format_Grayscale8); mViewer->setFixedSize(800, 800); 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); static int borderSpacing = (int)roundf(((PIXEL_SPACING * (PREVIEW_ROW * 0.5f) - HALF_ROI_WIDTH) * (800.0f / (1.5f * 140.0f)))); 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"); mViewer->setPixmap(pic); } void ScanFormWidget::initEvents() {//Events--------------------------------------------------------------- connect(EventCenter::Default(), &EventCenter::PatientSelected, [=](QObject* sender, QObject* data) { if (mUnInited) { mBtnScan->setEnabled(true); mBtnRefresh->setEnabled(true); mBtnPreview->setEnabled(true); mBtnStop->setEnabled(true); mUnInited = false; } mPatInf->setPatientInformation((PatientInformation*)data); }); connect(EventCenter::Default(), &EventCenter::ResponseStop, [=](QObject* sender, QObject* data) { setPreviewing(false); }); connect(EventCenter::Default(), &EventCenter::ResponsePreview, this,&ScanFormWidget::renderLoading); connect(EventCenter::Default(), &EventCenter::ResponsePreviewData, this,&ScanFormWidget::renderPreviewData); connect(EventCenter::Default(), &EventCenter::PatientSelected, [=](QObject* sender, QObject* data) { mPatInf->setPatientInformation((PatientInformation*)data); }); connect(EventCenter::Default(), &EventCenter::ReloadLanguage, this, &ScanFormWidget::reloadLanguage); connect(EventCenter::Default(), &EventCenter::DeviceErrorRaise, [=](QObject* parent, QObject* msg){ printf("signal:%d\r\n",senderSignalIndex()); setPreviewing(false); }); } void ScanFormWidget::reloadLanguage(){ mBtnLeft->setText(tr("LEFT")); mBtnRight->setText(tr("RIGHT")); mBtnRefresh->setText(tr("Refresh")); mBtnPreview->setText(tr("Preview")); mBtnStop->setText(tr("Stop")); mBtnScan->setText(tr("Scan")); mLblProtocol->setText(tr("Protocol")); mLblPreview->setText(tr("Preview Parameters")); mLblPreview->setText(tr("Scan Parameters")); mLblE->setText(tr("some settings\n\nparameters\n")); mLblE2->setText(tr("some settings\n\nparameters\n")); }