Files
GUI/src/forms/scan/ScanFormWidget.cpp
2023-08-31 15:44:11 +08:00

309 lines
11 KiB
C++

//
// Created by Krad on 2021/10/8.
//
#include "ScanFormWidget.h"
#include "ui_TabFormWidget.h"
#include <QVBoxLayout>
#include <QToolButton>
#include <QButtonGroup>
#include <QPainter>
#include <QLabel>
#include <qdebug.h>
#include "forms/scan/PatientInformationForm.h"
#include "event/EventCenter.h"
#include "log/UserOperationLog.h"
#include "json/jsonobject.h"
#include "device/DeviceManager.h"
#ifdef WIN32
#else
#include <cmath>
#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))
, mBtnDrainage(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");
mBtnDrainage->setObjectName("btnDrainage");
mBtnDrainage->setCheckable(true);
mBtnRefresh->setText(tr("Empty Scan"));
mBtnPreview->setText(tr("Preview"));
mBtnStop->setText(tr("Stop"));
mBtnScan->setText(tr("Scan"));
mBtnDrainage->setText(tr("Drainage"));
mBtnScan->setEnabled(false);
mBtnRefresh->setEnabled(false);
mBtnPreview->setEnabled(false);
mBtnStop->setEnabled(false);
layout->addWidget(mBtnRefresh);
layout->addWidget(mBtnPreview);
layout->addWidget(mBtnStop);
layout->addWidget(mBtnScan);
layout->addWidget(mBtnDrainage);
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 (!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)
EventCenter::Default()->triggerEvent(RequestPreviewStop, nullptr, nullptr);
});
connect(mBtnDrainage, &QToolButton::clicked, [=](bool aSatus) {
//Drainage
if(aSatus == true)
{
QString code = "1";
mBtnDrainage->setText(tr("Drainaging"));
EventCenter::Default()->triggerEvent(RequestDrainage, nullptr, (QObject*)(&code));
}
else
{
QString code = "0";
mBtnDrainage->setText(tr("Drainage"));
EventCenter::Default()->triggerEvent(RequestDrainage, nullptr, (QObject*)(&code));
}
});
}
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* /*sender*/,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::ResponseStopPreview, [=](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);
mBtnDrainage->setChecked(false);
mBtnDrainage->setText(tr("Drainage"));
});
}
void ScanFormWidget::reloadLanguage(){
mBtnLeft->setText(tr("LEFT"));
mBtnRight->setText(tr("RIGHT"));
mBtnRefresh->setText(tr("Empty Scan"));
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"));
mBtnDrainage->isChecked() ? mBtnDrainage->setText(tr("Drainaging")) : mBtnDrainage->setText(tr("Drainage"));
}