Files
GUI/src/forms/recon/ReconFormWidget.cpp
2023-09-11 17:00:30 +08:00

188 lines
7.1 KiB
C++

#include "ReconFormWidget.h"
#include "ui_TabFormWidget.h"
#include <QToolButton>
#include <QVBoxLayout>
#include <QHeaderView>
#include <QSqlRecord>
#include <QTimer>
#include "components/SlideTableView.h"
#include "db/SQLHelper.h"
#include "device/DeviceManager.h"
#include "ScanSearchCriteriaForm.h"
#include "ReconStateDelegate.h"
#include "ReconScanTimeDelegate.h"
#include "dialogs/DialogManager.h"
#include "log/UserOperationLog.h"
ReconFormWidget::ReconFormWidget(QWidget *parent)
: TabFormWidget(parent)
, mBtnDiscard(new QToolButton(this))
, mBtnDelete(new QToolButton(this))
, mBtnRefresh(new QToolButton(this))
, mScanTable(new SlideTableView(this))
, mSearchWidget(new ScanSearchCriteriaForm(this))
, mModel(nullptr)
, mRefreshTimer(new QTimer(this))
{
auto layout = new QHBoxLayout(ui->commandWidget);
layout->setAlignment(Qt::AlignmentFlag::AlignLeft);
mBtnDiscard->setObjectName("btnDiscard");
mBtnDelete->setObjectName("btnDelete");
mBtnRefresh->setObjectName("btnRefreshData");
mBtnDiscard->setText(tr("Discard"));
mBtnDelete->setText(tr("Delete"));
mBtnRefresh->setText(tr("Refresh"));
layout->addWidget(mBtnDiscard);
layout->addWidget(mBtnDelete);
layout->addSpacerItem(new QSpacerItem(20,20,QSizePolicy::Expanding));
addVerticalLine(layout);
layout->addWidget(mBtnRefresh);
initDataModel();
//Init content widget
mSearchWidget->setObjectName("SearchCriteriaForm");
ui->horizontalLayout->insertWidget(0, mSearchWidget);
insertVerticalLine(1,ui->horizontalLayout);
auto* contentLayout = new QHBoxLayout(this->ui->contentWidget);
contentLayout->setContentsMargins(0, 0, 0, 0);
initTableView(contentLayout);
connect(mBtnRefresh, &QToolButton::clicked, []()
{
LOG_USER_OPERATION("Update Recon State")
DeviceManager::Default()->updateReconState();
});
connect(DeviceManager::Default(), &DeviceManager::updateReconStateFinished, mModel, &QSqlTableModel::select);
connect(DeviceManager::Default(), &DeviceManager::transferStatusUpdated, mModel, &QSqlTableModel::select);
connect(mSearchWidget, &ScanSearchCriteriaForm::searchFilterUpdated, this, &ReconFormWidget::updateSearchFilter);
connect(mBtnDelete, &QToolButton::clicked, this, &ReconFormWidget::deleteReconRecord);
connect(mRefreshTimer, &QTimer::timeout, this, &ReconFormWidget::refreshTransferprogress);
}
void ReconFormWidget::initTableView(QHBoxLayout *contentLayout)
{
// TableView for Scan
ReconStateDelegate* delegate = new ReconStateDelegate(this);
mScanTable->setItemDelegateForColumn(getTableColumnIndex("State"), delegate);
ReconScanTimeDelegate* scanTimeDelegate = new ReconScanTimeDelegate(this);
mScanTable->setItemDelegateForColumn(getTableColumnIndex("ScanDateTime"), scanTimeDelegate);
mScanTable->setAlternatingRowColors(true);
mScanTable->setSelectionMode(QAbstractItemView::SingleSelection);
mScanTable->setEditTriggers(QAbstractItemView::NoEditTriggers);
mScanTable->setSelectionBehavior(QAbstractItemView::SelectRows);
mScanTable->verticalHeader()->setDefaultSectionSize(38);
mScanTable->horizontalHeader()->setStretchLastSection(true);
//data from SQLITE
//
//avoid pan comsumed by tableview!
mScanTable->viewport()->ungrabGesture(Qt::PanGesture);
mScanTable->setSortingEnabled(true); // enable sortingEnabled
mScanTable->setModel(mModel);
mScanTable->hideColumn(getTableColumnIndex("ScanID"));
mScanTable->hideColumn(getTableColumnIndex("ReferenceID"));
mScanTable->hideColumn(getTableColumnIndex("UpdateTime"));
mScanTable->setColumnWidth(getTableColumnIndex("PatientID"), 200);
mScanTable->setColumnWidth(getTableColumnIndex("AccessionNumber"), 200);
mScanTable->setColumnWidth(getTableColumnIndex("ScanDateTime"), 200);
mScanTable->setColumnWidth(getTableColumnIndex("PatientName"), 200);
mScanTable->setColumnWidth(getTableColumnIndex("Laterality"), 100);
mScanTable->setColumnWidth(getTableColumnIndex("OperatorName"), 200);
contentLayout->addWidget(mScanTable);
//table current row selection changing event
// after sort by column
}
void ReconFormWidget::initDataModel()
{
//TODO:单独初始化预防SQL错误
mModel = SQLHelper::getTable("Scan");
mModel->sort(getTableColumnIndex("ScanDateTime"), Qt::DescendingOrder);
updateSearchFilter();
mModel->setHeaderData(getTableColumnIndex("PatientID"), Qt::Horizontal, tr("Patient ID"));
mModel->setHeaderData(getTableColumnIndex("AccessionNumber"), Qt::Horizontal, tr("Accession Number"));
mModel->setHeaderData(getTableColumnIndex("PatientName"), Qt::Horizontal, tr("Patient Name"));
mModel->setHeaderData(getTableColumnIndex("ScanDateTime"), Qt::Horizontal, tr("Scan Time"));
mModel->setHeaderData(getTableColumnIndex("Laterality"), Qt::Horizontal, tr("Laterality"));
mModel->setHeaderData(getTableColumnIndex("OperatorName"), Qt::Horizontal, tr("Operator Name"));
mModel->setHeaderData(getTableColumnIndex("State"), Qt::Horizontal, tr("State"));
}
void ReconFormWidget::updateSearchFilter()
{
mModel->setFilter(mSearchWidget->getSearchFilter());
mModel->select();
}
void ReconFormWidget::showEvent(QShowEvent *aEvent)
{
TabFormWidget::showEvent(aEvent);
DeviceManager::Default()->updateReconState();
mRefreshTimer->start(1000);
}
void ReconFormWidget::hideEvent(QHideEvent *aEvent)
{
mRefreshTimer->stop();
TabFormWidget::hideEvent(aEvent);
}
void ReconFormWidget::deleteReconRecord()
{
if(mScanTable->currentIndex().row() < 0)
{
DialogManager::Default()->requestAlertMessage(tr("No data selected."), DialogButtonMode::OkOnly, tr("Alert"));
return;
}
int currentRowIndex = mScanTable->currentIndex().row();
int state = mModel->index(currentRowIndex, getTableColumnIndex("State")).data().toInt();
if(state != 999)
{
DialogManager::Default()->requestAlertMessage(tr("Can not delete this record before pacs succeed."), DialogButtonMode::OkOnly, tr("Alert"));
return;
}
QString patientName = mModel->index(currentRowIndex, getTableColumnIndex("PatientName")).data().toString();
if (DialogManager::Default()->requestAlertMessage(QString(tr("Delete recon record with patient \"%1\" ?")).arg(patientName),DialogButtonMode::OkAndCancel,tr("Confirm")) != QDialog::Accepted)
{
return;
}
mModel->removeRow(currentRowIndex);
if (mModel->submitAll())
{
mModel->select();
if (mModel->rowCount() > 0)
{
mScanTable->selectRow(0);
mModel->selectRow(0);
LOG_USER_OPERATION(QString("Delete Recon, ID: %1").arg(mModel->index(currentRowIndex, getTableColumnIndex("PatientID")).data().toString()))
}
}
else
{
DialogManager::Default()->requestAlertMessage(tr("Can't delete selected record , db error!"), DialogButtonMode::OkOnly, tr("Alert"));
}
}
int ReconFormWidget::getTableColumnIndex(const QString& aColumnName)
{
return mModel->record().indexOf(aColumnName);
}
void ReconFormWidget::refreshTransferprogress()
{
if(DeviceManager::Default()->updateTransferProgress())
{
mScanTable->viewport()->update();
}
}