SVG5/formviewer.cpp
2025-10-12 13:55:56 +09:00

1526 lines
43 KiB
C++

#include "formviewer.h"
#include "ui_formviewer.h"
#include <QThread>
#include <QWheelEvent>
#include "mainwindow.h"
#include "dialogprogress.h"
#include "SDCMSendImpl.h"
#include "cscallbacksendprogress.h"
#include "SDCMImage.h"
#include <QFileInfo>
#include <QDirIterator>
FormViewer::FormViewer(QWidget *parent) :
QWidget(parent),
ui(new Ui::FormViewer)
{
ui->setupUi(this);
MainWindow* pMainWindow = MainWindow::GetMainWindow();
connect(this, SIGNAL(ExitViewer()), pMainWindow, SLOT(ExitViewer()));
connect(this, SIGNAL(ChangeMenu(int)), pMainWindow, SLOT(ChangeMenu(int)));
connect(this, SIGNAL(BackupNetworkShareFolder(QString)), pMainWindow, SLOT(BackupNetworkShareFolder(QString)));
m_nIndexCurrent = 0;
m_nTotalImageCount = 0;
m_pSlideBarVertical = ui->verticalScrollBar;
m_pDialogSendProgress = new DialogProgress(this);
ui->verticalScrollBar->SetSlideType(SSlideBar::SLIDE_VERTICAL);
ui->verticalScrollBar->setRange(0, 299);
connect(ui->verticalScrollBar, SIGNAL(valueChanged(int)), this, SLOT(valueChangedScrollBarVertical(int)));
//connect(this, SIGNAL(SetSlideValue(int)), ui->verticalScrollBar, SLOT(setValue(int)));
connect(ui->verticalScrollBar, SIGNAL(actionTriggered(int)), this, SLOT(actionTriggered(int)));
connect(ui->verticalScrollBar, SIGNAL(SingleDown()), this, SLOT(SingleDown()));
connect(ui->verticalScrollBar, SIGNAL(SingleUp()), this, SLOT(SingleUp()));
int i = 0;
for(i=0 ; i<9 ; i++)
{
FormImageSelect* pForm = new FormImageSelect(this);
pForm->SetIndexViewer(i);
pForm->hide();
m_ListFormImageSelect.push_back(pForm);
}
//ChangeViewMode(0);
}
FormViewer::~FormViewer()
{
CommonData* pCommonData = MainWindow::GetCommonData();
MainWindow* pMainWindow = MainWindow::GetMainWindow();
SThreadImageSave* pThreadImage = pCommonData->GetThreadCaptureImage();
disconnect(pThreadImage, SIGNAL(ImageLoadComplete()), this, SLOT(ImageLoadComplete()));
disconnect(this, SIGNAL(ExitViewer()), pMainWindow, SLOT(ExitViewer()));
disconnect(this, SIGNAL(ChangeMenu(int)), pMainWindow, SLOT(ChangeMenu(int)));
disconnect(this, SIGNAL(BackupNetworkShareFolder(QString)), pMainWindow, SLOT(BackupNetworkShareFolder(QString)));
disconnect(ui->verticalScrollBar, SIGNAL(valueChanged(int)), this, SLOT(valueChangedScrollBarVertical(int)));
//disconnect(this, SIGNAL(SetSlideValue(int)), ui->verticalScrollBar, SLOT(setValue(int)));
disconnect(ui->verticalScrollBar, SIGNAL(actionTriggered(int)), this, SLOT(actionTriggered(int)));
disconnect(ui->verticalScrollBar, SIGNAL(SingleDown()), this, SLOT(SingleDown()));
disconnect(ui->verticalScrollBar, SIGNAL(SingleUp()), this, SLOT(SingleUp()));
if(m_pDialogSendProgress!=NULL)
{
delete m_pDialogSendProgress;
}
delete ui;
}
void FormViewer::on_comboBox_ViewerMode_currentIndexChanged(int index)
{
ChangeViewMode(index);
}
void FormViewer::ChangeViewMode(int nMode)
{
int nIndex = 0;
int nRow = ui->gridLayout_Viewer->rowCount();
int nColumn = ui->gridLayout_Viewer->columnCount();
int i=0;
int j=0;
if(m_nMode!=nMode)
{
m_nIndexCurrent = 0;
for(i=0 ; i<nRow ; i++)
{
for(j=0 ; j<nColumn ; j++)
{
FormImageSelect* pForm = m_ListFormImageSelect[nIndex];
nIndex++;
pForm->hide();
ui->gridLayout_Viewer->removeWidget(pForm);
}
}
nIndex = 0;
nRow = 1;
nColumn = 1;
if(nMode==0)
{
nRow = 1;
nColumn = 1;
}
else if(nMode==1)
{
nRow = 2;
nColumn = 2;
}
else if(nMode==2)
{
nRow = 3;
nColumn = 3;
}
for(i=0 ; i<nRow ; i++)
{
for(j=0 ; j<nColumn ; j++)
{
FormImageSelect* pForm = m_ListFormImageSelect[nIndex];
nIndex++;
ui->gridLayout_Viewer->addWidget(pForm, i, j);
pForm->show();
pForm->Init();
}
}
}
m_nMode = nMode;
nIndex = 0;
//CommonData* pCommonData = MainWindow::GetCommonData();
//vector<ImageSelect*>* pListHistoryImage = pCommonData->GetListHistoryImage();
int nTotalImage = 0;
//for(i=0 ; i<pListHistoryImage->size() ; i++)
for(i=0 ; i<m_ListImageSelect.size() ; i++)
{
//ImageSelect* pImageSelect = (*pListHistoryImage)[i];
ImageSelect* pImageSelect = m_ListImageSelect[i];
if(pImageSelect->m_bDelete==false)
{
nTotalImage++;
}
}
//m_nTotalImageCount = nTotalImage;
for(i=0 ; i<nRow ; i++)
{
for(j=0 ; j<nColumn ; j++)
{
FormImageSelect* pForm = m_ListFormImageSelect[nIndex];
//ImageSelect* pImageSelect = m_ListImage[nIndex];
ImageSelect* pImageSelect = NULL;
if(nTotalImage > nIndex)
{
int k=0;
int nTestIndex = 0;
//for(k=0 ; k<pListHistoryImage->size() ; k++)
for(k=0 ; k<m_ListImageSelect.size() ; k++)
{
//ImageSelect* pTmpImage = (*pListHistoryImage)[k];
ImageSelect* pTmpImage = m_ListImageSelect[k];
if(pTmpImage->m_bDelete==false)
{
if(nTestIndex==nIndex)
{
pImageSelect = pTmpImage;
break;
}
nTestIndex++;
}
//pImageSelect = (*pListHistoryImage)[nIndex];
}
}
pForm->SetImageSelect(pImageSelect);
pForm->update();
nIndex++;
}
}
int nItem = 20;
int nIndexCurrent = m_nIndexCurrent;
//nItem = pListHistoryImage->size();
nItem = m_nTotalImageCount;
float fMaxRange = 299;
int nPageDisplay = 0;
int nPageTotal = 0;
int nItemPerPage = 1;
switch(m_nMode)
{
case 0:
nItemPerPage = 1;
break;
case 1:
nItemPerPage = 4;
break;
case 2:
nItemPerPage = 9;
break;
}
//nIndexCurrent += nItemPerPage;
//nPageTotal = ((nItem-1) / nItemPerPage) + 1;
//nPageDisplay = nIndexCurrent / nItemPerPage;
nPageTotal = (nItem-1) / nItemPerPage;
nPageDisplay = nIndexCurrent + 1;
nPageTotal = nPageTotal + 1;
if(nPageTotal<=1)
{
ui->frame_verticalScrollBar->hide();
m_pSlideBarVertical->hide();
}
else
{
if(m_pSlideBarVertical!=NULL)
{
m_pSlideBarVertical->setValue(0);
}
ui->frame_verticalScrollBar->show();
m_pSlideBarVertical->show();
}
update();
ui->comboBox_ViewerMode->setCurrentIndex(nMode);
//QString strIndexPage = QString("Page Index: %1/%2").arg(nPageDisplay+1).arg(nPageTotal);
QString strIndexPage = QString("Page Index: %1/%2").arg(nPageDisplay).arg(nPageTotal);
ui->info_DisplayIndex->setText(strIndexPage);
}
void FormViewer::SingleUp()
{
//CommonData* pCommonData = MainWindow::GetCommonData();
//vector<ImageSelect*>* pListHistoryImage = pCommonData->GetListHistoryImage();
int nItem = 20;
int nIndexCurrent = m_nIndexCurrent;
//nItem = pListHistoryImage->size();
nItem = m_nTotalImageCount;
float fMaxRange = 300;
int nPageDisplay = 0;
int nPageTotal = 0;
int nItemPerPage = 1;
switch(m_nMode)
{
case 0:
nItemPerPage = 1;
break;
case 1:
nItemPerPage = 4;
break;
case 2:
nItemPerPage = 9;
break;
}
nIndexCurrent -= nItemPerPage;
nPageTotal = ((nItem-1) / nItemPerPage) + 1;
nPageDisplay = nIndexCurrent / nItemPerPage;
if(nPageTotal<=1)
{
return;
}
if(nPageDisplay < 0)
{
nPageDisplay = 0;
}
nIndexCurrent = nPageDisplay * nItemPerPage;
if(nIndexCurrent!=m_nIndexCurrent)
{
int nCurrentPos;
nCurrentPos = (int)(((float)nPageDisplay / (float)(nPageTotal-1)) * fMaxRange + 0.5f);
//qDebug() << "PageDisplay: " << nPageDisplay << " PageTotal: " << nPageTotal << " nCurrentPos: " << nCurrentPos;
m_pSlideBarVertical->setValue(nCurrentPos);
}
QString strIndexPage = QString("Page Index: %1/%2").arg(nPageDisplay+1).arg(nPageTotal);
ui->info_DisplayIndex->setText(strIndexPage);
QString strInfoStoage = QString("IMG: %1").arg(m_nTotalImageCount);
ui->info_Storage->setText(strInfoStoage);
}
void FormViewer::SingleDown()
{
//CommonData* pCommonData = MainWindow::GetCommonData();
//vector<ImageSelect*>* pListHistoryImage = pCommonData->GetListHistoryImage();
int nItem = 20;
int nIndexCurrent = m_nIndexCurrent;
//nItem = pListHistoryImage->size();
nItem = m_nTotalImageCount;
float fMaxRange = 299;
int nPageDisplay = 0;
int nPageTotal = 0;
int nItemPerPage = 1;
switch(m_nMode)
{
case 0:
nItemPerPage = 1;
break;
case 1:
nItemPerPage = 4;
break;
case 2:
nItemPerPage = 9;
break;
}
nIndexCurrent += nItemPerPage;
nPageTotal = ((nItem-1) / nItemPerPage) + 1;
nPageDisplay = nIndexCurrent / nItemPerPage;
if(nPageTotal<=1)
{
return;
}
if(nPageDisplay >= nPageTotal)
{
nPageDisplay = nPageTotal - 1;
}
nIndexCurrent = nPageDisplay * nItemPerPage;
if(nIndexCurrent!=m_nIndexCurrent)
{
int nCurrentPos;
nCurrentPos = (int)( (((float)nPageDisplay / (float)(nPageTotal-1)) * fMaxRange) + 0.5f);
//qDebug() << "PageDisplay: " << nPageDisplay << " PageTotal: " << nPageTotal << " nCurrentPos: " << nCurrentPos;
m_pSlideBarVertical->setValue(nCurrentPos);
}
QString strIndexPage = QString("Page Index: %1/%2").arg(nPageDisplay+1).arg(nPageTotal);
ui->info_DisplayIndex->setText(strIndexPage);
QString strInfoStoage = QString("IMG: %1").arg(m_nTotalImageCount);
ui->info_Storage->setText(strInfoStoage);
}
void FormViewer::valueChangedScrollBarVertical(int value)
{
//CommonData* pCommonData = MainWindow::GetCommonData();
//vector<ImageSelect*>* pListHistoryImage = pCommonData->GetListHistoryImage();
//int nItem = pListHistoryImage->size();
int nItem = m_nTotalImageCount;
float fMaxItem = nItem;
float fMaxRange = 299;
int nItemIndex = (((float)value/fMaxRange) * fMaxItem + 0.5f);
int nPageDisplay = 0;
int nPageTotal = 0;
int nItemPerPage = 1;
switch(m_nMode)
{
case 0:
nItemPerPage = 1;
break;
case 1:
nItemPerPage = 4;
break;
case 2:
nItemPerPage = 9;
break;
}
nPageTotal = ((nItem-1) / nItemPerPage) + 1;
nPageDisplay = ( ((float)value / fMaxRange) * (nPageTotal-1) + 0.5f );
//nItemIndex += nItemPerPage;
//nPageDisplay = nItemIndex / nItemPerPage;
if(nPageTotal<=1)
{
return;
}
if(nPageDisplay >= nPageTotal)
{
nPageDisplay = nPageTotal-1;
}
nItemIndex = nPageDisplay * nItemPerPage;
m_nCurrentPos = value;
if(m_nIndexCurrent!=nItemIndex)
{
m_nIndexCurrent = nItemIndex;
UpdateViewer();
QString strIndexPage = QString("Page Index: %1/%2").arg(nPageDisplay+1).arg(nPageTotal);
ui->info_DisplayIndex->setText(strIndexPage);
}
}
void FormViewer::actionTriggered(int action)
{
}
void FormViewer::UpdateViewer()
{
int nIndex = 0;
int nRow = 1;
int nColumn = 1;
int nMode = m_nMode;
int i=0;
int j=0;
nIndex = 0;
nRow = 1;
nColumn = 1;
if(nMode==0)
{
nRow = 1;
nColumn = 1;
}
else if(nMode==1)
{
nRow = 2;
nColumn = 2;
}
else if(nMode==2)
{
nRow = 3;
nColumn = 3;
}
nIndex = 0;
CommonData* pCommonData = MainWindow::GetCommonData();
HISTORY_STUDY* pHistoryStudy = pCommonData->GetCurrentHistoryStudy();
//vector<ImageSelect*>* pListHistoryImage = pCommonData->GetListHistoryImage();
for(i=0 ; i<nRow ; i++)
{
for(j=0 ; j<nColumn ; j++)
{
FormImageSelect* pForm = m_ListFormImageSelect[nIndex];
int nDisplayIndex = m_nIndexCurrent+nIndex;
//if(nDisplayIndex<pListHistoryImage->size())
if(nDisplayIndex<m_ListImageSelect.size())
{
ImageSelect* pImageSelect = NULL;
//if(pListHistoryImage->size() > nDisplayIndex)
if(m_ListImageSelect.size() > nDisplayIndex)
{
int k=0;
int nCheck = 0;
//for(k=0 ; k<pListHistoryImage->size() ; k++)
for(k=0 ; k<m_ListImageSelect.size() ; k++)
{
//ImageSelect* pImage = (*pListHistoryImage)[k];
ImageSelect* pImage = m_ListImageSelect[k];
if(pImage->m_bDelete==false)
{
if(nCheck==nDisplayIndex)
{
pImageSelect = pImage;
break;
}
nCheck++;
}
}
//pImageSelect = (*pListHistoryImage)[nDisplayIndex];
}
pForm->SetImageSelect(pImageSelect);
if(pImageSelect!=NULL)
{
//qDebug() << pImageSelect->m_strFile;
}
}
else
{
pForm->SetImageSelect(NULL);
}
pForm->update();
nIndex++;
}
}
//update();
QString strBirthDate = *pHistoryStudy->pStrPatientBirthDate;
strBirthDate.insert(6, '/');
strBirthDate.insert(4, '/');
QString strStudyDate = *pHistoryStudy->pStrStudyDate;
strStudyDate.insert(6, '/');
strStudyDate.insert(4, '/');
ui->info_ID->setText(*pHistoryStudy->pStrPatientID);
ui->info_Name->setText(*pHistoryStudy->pStrPatientName);
ui->info_StudyDate->setText(strStudyDate);
ui->info_Birth->setText(strBirthDate);
pCommonData->ReleaseCurrentHistoryStudy();
//ui->gridLayoutWidget->update();
//ui->gridLayout_Viewer->update();
}
void FormViewer::wheelEvent(QWheelEvent *event)
{
int nDelta = event->delta();
if(nDelta<0)
{
SingleDown();
}
else if(nDelta>0)
{
SingleUp();
}
}
void FormViewer::on_pushButton_EXIT_clicked()
{
CommonData* pCommonData = MainWindow::GetCommonData();
SThreadImageSave* pThread = pCommonData->GetThreadCaptureImage();
int nCurrentState = pThread->GetCurrentState();
if(nCurrentState&0x08)
{
//Loading State
pThread->CancelLoad();
while(pThread->GetCurrentState()&0x08)
{
usleep(10*1000);
}
}
int i=0;
for(i=0 ; i<m_ListFormImageSelect.size() ; i++)
{
FormImageSelect* pForm = m_ListFormImageSelect[i];
pForm->SetImageSelect(NULL);
}
pCommonData->ClearHistoryImage();
m_ListImageSelect.clear();
//UpdateViewer();
ExitViewer();
//pCommonData->ClearHistoryImage();
}
void FormViewer::Init()
{
m_ListImageSelect.clear();
m_nIndexCurrent = 0;
m_nTotalImageCount = 0;
m_bExecMenu = false;
ui->verticalScrollBar->setValue(0);
ui->pushButton_AddCapture->hide();
ui->pushButton_DELETE->hide();
ui->pushButton_SEND->hide();
int i=0;
for(i=0 ; i<m_ListFormImageSelect.size() ; i++)
{
FormImageSelect* pForm = m_ListFormImageSelect[i];
pForm->SetImageSelect(NULL);
pForm->Init();
}
ui->comboBox_ViewerMode->setCurrentIndex(0);
ChangeViewMode(0);
UpdateViewer();
}
void FormViewer::on_pushButton_SEND_clicked()
{
//DialogProgress dlg(this);
//dlg.exec();
int i=0;
CommonData* pCommonData = MainWindow::GetCommonData();
vector<ImageSelect*>* pListHistoryImage = pCommonData->GetListHistoryImage();
QList<QStringList> listFile;
if(pCommonData->IsUseNetworkBackupVideo()==true && pListHistoryImage->size()>0)
{
vector<QString>* pListExport = pCommonData->GetExportList();
pListExport->clear();
ImageSelect* pHistoryImage = (*pListHistoryImage)[0];
QString strFile = pHistoryImage->m_strFile;
QFileInfo fi(strFile);
QString strPath = fi.path();
strPath = strPath.replace("/data/image/", "/data/video/");
QStringList filter;
if(strPath.size()>0)
{
QString strFilter = QString("*") + QString(MOVIE_FILE_EXTENSION);
filter << strFilter;
}
QDirIterator it(strPath, filter, QDir::AllEntries | QDir::NoSymLinks | QDir::NoDotAndDotDot, QDirIterator::NoIteratorFlags);
QStringList listMovieFile;
while(it.hasNext()==true)
{
QString strVideoFilename = it.next();
listMovieFile << strVideoFilename;
pListExport->push_back(strVideoFilename);
}
if(pListExport->size()>0)
{
BackupNetworkShareFolder("");
pListExport->clear();
}
}
for(i=0 ; i<pListHistoryImage->size() ; i++)
{
ImageSelect* pImageSelect = (*pListHistoryImage)[i];
if(pImageSelect->m_bSelect==true && pImageSelect->m_nType==DISPLAY_IMAGE)
{
//`FileLocation`, `AcquisitionNumber`, `AcquisitionDate`, `AcquisitionTime`, `ImageDelete`, `ImageSend`
QString strFile = pImageSelect->m_strFile;
QString strAcquisitionNumber;
QString strAcquisitionDate;
QString strAcquisitionTime;
QString strImageDelete;
QString strImageSend;
strAcquisitionNumber = QString("%1").arg(pImageSelect->m_nImageNumber);
strAcquisitionDate = pImageSelect->m_strDate;
strAcquisitionTime = pImageSelect->m_strTime;
if(pImageSelect->m_bDelete==true)
{
strImageDelete = "1";
}
else
{
strImageDelete = "0";
}
if(pImageSelect->m_bSend==true)
{
strImageSend = "1";
}
else
{
strImageSend = "0";
}
QStringList listData;
listData.push_back(strFile);
listData.push_back(strAcquisitionNumber);
listData.push_back(strAcquisitionDate);
listData.push_back(strAcquisitionTime);
listData.push_back(strImageDelete);
listData.push_back(strImageSend);
listFile.push_back(listData);
}
}
pCommonData->ReleaseListHistoryImage();
if(listFile.size()>0)
{
SThreadSendDICOM* pThreadSendDICOM = pCommonData->GetThreadSendDICOM();
pThreadSendDICOM->SetSendImageList(listFile);
if(m_pDialogSendProgress!=NULL)
{
delete m_pDialogSendProgress;
}
m_pDialogSendProgress = new DialogProgress(this);
//m_pDialogSendProgress->Init(1);
m_pDialogSendProgress->Init(0x11);
m_pDialogSendProgress->exec();
// --- DB 업데이트 로직 수정 ---
vector<QString> listImageSendCompleteFile = pThreadSendDICOM->GetListImageSendCompleteFile();
if (!listImageSendCompleteFile.empty())
{
// 2. 이 작업을 위한 지역 DB 인스턴스를 생성합니다.
SUTIL::SDatabase db(QString("SendUpdate_%1").arg(reinterpret_cast<quintptr>(this)));
if (db.OpenDatabase("/home/birdhead/test.db") == 0)
{
// 3. WHERE IN 절을 사용하여 단 한 번의 쿼리로 모든 데이터를 업데이트합니다. (가장 효율적인 방법)
QStringList placeholders;
for (size_t i = 0; i < listImageSendCompleteFile.size(); ++i) {
placeholders << "?";
}
QString query = QString("UPDATE Image SET ImageSend = 1 WHERE FileLocation IN (%1)")
.arg(placeholders.join(','));
QVariantList params;
for (const QString& file : listImageSendCompleteFile) {
params << file;
}
db.ExecuteNonQuery(query, params);
}
}
}
//SDatabase::DeleteListReponse(listFile);
listFile.clear();
}
void FormViewer::UpdateMakeDICOMInfo(int nCount, int nTotalCount)
{
m_pDialogSendProgress->DisplayInfo(nCount, nTotalCount);
QString strInfo = QString("DICOM Make %1 / %2").arg(nCount).arg(nTotalCount);
m_pDialogSendProgress->DisplayInfo(strInfo);
}
void FormViewer::UpdateSendInfo(int nCount, int nTotalCount)
{
m_pDialogSendProgress->DisplayInfo(nCount, nTotalCount);
QString strInfo = QString("%1 / %2").arg(nCount).arg(nTotalCount);
m_pDialogSendProgress->DisplayInfo(strInfo);
}
void FormViewer::UpdateSendComplete()
{
m_pDialogSendProgress->DisplayInfo(-1, 100);
QString strInfo = QString("Send Complete");
m_pDialogSendProgress->DisplayInfo(strInfo);
QThread::msleep(1000);
//m_pDialogSendProgress->SendComplete();
//m_pDialogSendProgress->accept();
}
void FormViewer::UpdateSendFailed()
{
m_pDialogSendProgress->DisplayInfo(-1, 100);
//QString strInfo = QString("Error: Check Network");
//m_pDialogSendProgress->DisplayInfo(strInfo);
m_pDialogSendProgress->DisplayInfo(-1);
//QThread::msleep(1000);
//m_pDialogSendProgress->SendComplete();
//m_pDialogSendProgress->accept();
}
void FormViewer::SetTotalImageCount(int nCount)
{
m_nTotalImageCount = nCount;
if(m_nTotalImageCount==0)
{
ImageLoadComplete();
}
}
void FormViewer::SetImageLoadInfo(int nLoad, int nTotal, ImageSelect* pImageSelectLoad)
{
if(nLoad>=nTotal)
{
return;
}
m_ListImageSelect.push_back(pImageSelectLoad);
int nIndex = 0;
int nRow = 1;
int nColumn = 1;
int nMode = m_nMode;
int i=0;
int j=0;
nIndex = 0;
nRow = 1;
nColumn = 1;
if(nMode==0)
{
nRow = 1;
nColumn = 1;
}
else if(nMode==1)
{
nRow = 2;
nColumn = 2;
}
else if(nMode==2)
{
nRow = 3;
nColumn = 3;
}
nIndex = 0;
int nIndexMaxView = m_nIndexCurrent + (nRow * nColumn-1);
if(nLoad<=nIndexMaxView && nLoad>=m_nIndexCurrent)
{
}
else
{
return;
}
//CommonData* pCommonData = MainWindow::GetCommonData();
//vector<ImageSelect*>* pListHistoryImage = pCommonData->GetListHistoryImage();
m_nPageTotal = m_nTotalImageCount / (nRow*nColumn);
if(m_nTotalImageCount%(nRow*nColumn)!=0)
{
m_nPageTotal++;
}
m_nPageCurrent = (int)(nLoad / (nRow*nColumn)) + 1;
for(i=0 ; i<nRow ; i++)
{
for(j=0 ; j<nColumn ; j++)
{
FormImageSelect* pForm = m_ListFormImageSelect[nIndex];
int nDisplayIndex = m_nIndexCurrent+nIndex;
//if(nDisplayIndex<pListHistoryImage->size())
if(nDisplayIndex<m_ListImageSelect.size())
{
ImageSelect* pImageSelect = NULL;
//if(pListHistoryImage->size() > nDisplayIndex)
if(m_ListImageSelect.size() > nDisplayIndex)
{
int k=0;
int nCheck = 0;
for(k=0 ; k<m_ListImageSelect.size() ; k++)
{
ImageSelect* pImage = m_ListImageSelect[k];
if(pImage->m_bDelete==false)
{
if(nCheck==nDisplayIndex)
{
pImageSelect = pImage;
break;
}
nCheck++;
}
}
//pImageSelect = (*pListHistoryImage)[nDisplayIndex];
}
pForm->SetImageSelect(pImageSelect);
if(pImageSelect!=NULL)
{
//qDebug() << pImageSelect->m_strFile;
}
}
else
{
pForm->SetImageSelect(NULL);
}
pForm->update();
nIndex++;
}
}
QString strIndexPage = QString("Page Index: %1/%2").arg(m_nPageCurrent).arg(m_nPageTotal);
ui->info_DisplayIndex->setText(strIndexPage);
QString strInfoStoage = QString("IMG: %1").arg(nTotal);
ui->info_Storage->setText(strInfoStoage);
}
void FormViewer::on_pushButton_Rotate_clicked()
{
int i = 0;
for(i=0 ; i<9 ; i++)
{
FormImageSelect* pForm = m_ListFormImageSelect[i];
bool bSelect = pForm->IsSelect();
if(bSelect==true)
{
pForm->DisplayRotate();
}
}
}
void FormViewer::on_pushButton_ZoomInOut_clicked()
{
int i = 0;
for(i=0 ; i<9 ; i++)
{
FormImageSelect* pForm = m_ListFormImageSelect[i];
bool bSelect = pForm->IsSelect();
if(bSelect==true)
{
pForm->setCursor(Qt::ClosedHandCursor);
pForm->EnableZoom(true);
}
else
{
pForm->EnableZoom(false);
}
}
}
void FormViewer::on_pushButton_FlipHorizontal_clicked()
{
int i = 0;
for(i=0 ; i<9 ; i++)
{
FormImageSelect* pForm = m_ListFormImageSelect[i];
bool bSelect = pForm->IsSelect();
if(bSelect==true)
{
pForm->DisplayFlipHorizontal();
}
}
}
void FormViewer::on_pushButton_FlipVertical_clicked()
{
int i = 0;
for(i=0 ; i<9 ; i++)
{
FormImageSelect* pForm = m_ListFormImageSelect[i];
bool bSelect = pForm->IsSelect();
if(bSelect==true)
{
pForm->DisplayFlipVertical();
}
}
}
void FormViewer::on_pushButton_Move_clicked()
{
int i = 0;
for(i=0 ; i<9 ; i++)
{
FormImageSelect* pForm = m_ListFormImageSelect[i];
bool bSelect = pForm->IsSelect();
if(bSelect==true)
{
pForm->setCursor(Qt::ClosedHandCursor);
pForm->EnableMove(true);
}
else
{
pForm->EnableMove(false);
}
}
}
void FormViewer::resizeEvent(QResizeEvent *event)
{
int nDisplayType = MainWindow::GetCommonData()->GetDisplayType();
int nFontSize = 22;
int nFontSizeCaptureTitle = 30;
int nFontSizeButton = 22;
int nFontInfoLabel = 22;
int nFontInfoInfo = 22;
int nScrollWidth = 26;
if(nDisplayType==SDISPLAY_1280X1024)
{
nFontSize = 16;
nFontSizeCaptureTitle = 25;
nFontSizeButton = 18;
nFontInfoLabel = 18;
nFontInfoInfo = 22;
//ui->frame_Viewer_Vertical->hide();
//ui->frame_Viewer_Horizontal->show();
ui->frame_capture->setGeometry(40, 45, 1200, 1024-90);
ui->label_Viewer->setGeometry(38, 24, 300, 45);
ui->pushButton_EXIT->setGeometry(1003, 22, 140, 45);
ui->frame_Line->setGeometry(38, 69, 965+140, 27);
ui->display_line->setGeometry(0, 27/2, 965+140, 1);
//ui->frame_InfoString->setGeometry(38, 69+27, 965+140, 59);
ui->frame_InfoString->setGeometry(152, 24, 760, 45);
{
ui->label_ID->setGeometry(0, 0, 30, 45);
ui->info_ID->setGeometry(40, 0, 160, 45);
ui->label_Name->setGeometry(180, 0, 70, 45);
ui->info_Name->setGeometry(260, 0, 160, 45);
ui->label_StudyDate->setGeometry(450, 0, 120, 45);
ui->info_StudyDate->setGeometry(600, 0, 160, 45);
ui->label_Birth->hide();
ui->info_Birth->hide();
}
ui->gridLayoutWidget->setGeometry(39, 155, 1103, 621);
ui->pushButton_SEND->setGeometry(1029, 155+621+61-45, 115, 45);
ui->pushButton_DELETE->setGeometry(1029, 155+621+133-45, 115, 45);
ui->pushButton_AddCapture->setGeometry(39, 155+621+61-45, 125, 45);
ui->info_DisplayIndex->setGeometry(880, 96, 260, 48);
{
nScrollWidth = 20;
ui->frame_verticalScrollBar->setGeometry(1144, 155, 20, 622);
ui->verticalScrollBar->setGeometry(0, 0, 20, 622);
//ui->horizontalSlider_Hue->setGeometry(310, 40, 300, 16);
//ui->horizontalSlider_Saturation->setGeometry(650, 40, 300, 16);
}
ui->comboBox_ViewerMode->setGeometry(80-40, 140-45, 120, 30);
//ui->frame_Viewer_Horizontal->setGeometry(95, 155+621+61-45, 1029-150, 117);
}
else if(nDisplayType==SDISPLAY_1920X1080)
{
nFontSizeCaptureTitle = 30;
nFontSizeButton = 22;
nFontInfoLabel = 22;
nFontInfoInfo = 22;
//ui->frame_Viewer_Vertical->show();
//ui->frame_Viewer_Horizontal->hide();
ui->frame_capture->setGeometry(36, 36, 1855, 1028);
ui->label_Viewer->setGeometry(55, 30, 200, 40);
ui->pushButton_EXIT->setGeometry(1580, 27, 161, 51);
ui->frame_Line->setGeometry(55, 80, 1749, 53);
ui->display_line->setGeometry(0, 53/2, 1749, 1);
//ui->frame_Info->setGeometry(0, 133, 1855, 96);
//ui->pushButton_ACQ->setGeometry(1399, 0, 153, 63);
//ui->pushButton_VID->setGeometry(1591, 0, 153, 63);
ui->frame_InfoString->setGeometry(55, 0, 800, 63);
{
ui->label_ID->setGeometry(0, 0, 30, 63);
ui->info_ID->setGeometry(40, 0, 161, 63);
ui->label_Name->setGeometry(200, 0, 70, 63);
ui->info_Name->setGeometry(280, 0, 161, 63);
ui->label_Birth->setGeometry(490, 0, 70, 63);
ui->info_Birth->setGeometry(570, 0, 161, 63);
}
//ui->widget_Video->setGeometry(55, 230, 1280, 720);
ui->pushButton_SEND->setGeometry(1398, 940, 161, 51);
ui->pushButton_DELETE->setGeometry(1582, 940, 161, 51);
{
//ui->horizontalSlider_Hue->setGeometry(310, 40, 451, 16);
//ui->horizontalSlider_Saturation->setGeometry(840, 40, 451, 16);
}
}
QString strCaptureTitle = QString(
"QLabel \
{ \
font-family: 'Roboto'; \
font-size: %1px; \
font-weight: bold; \
color: #000000; \
}").arg(nFontSizeCaptureTitle);
ui->label_Viewer->setStyleSheet(strCaptureTitle);
QString strPushButton_Exit_Delete = QString(
"QPushButton \
{ \
background: #FFFFFF; \
font-family: 'Roboto'; \
font-size: %1px; \
font-weight: bold; \
border-radius: 8px; \
color: black; \
} \
QPushButton:pressed \
{ \
background: #D8D8D8; \
}").arg(nFontSizeButton);
ui->pushButton_EXIT->setStyleSheet(strPushButton_Exit_Delete);
ui->pushButton_DELETE->setStyleSheet(strPushButton_Exit_Delete);
QString strPushButton_ACQ_VID = QString(
"QPushButton \
{ \
background: #153B44; \
font-family: 'Roboto'; \
font-size: %1px; \
font-weight: bold; \
border-radius: 8px; \
color: white; \
} \
QPushButton:pressed \
{ \
background: #1B4C54; \
}").arg(nFontSizeButton);
//ui->pushButton_ACQ->setStyleSheet(strPushButton_ACQ_VID);
//ui->pushButton_VID->setStyleSheet(strPushButton_ACQ_VID);
ui->pushButton_SEND->setStyleSheet(strPushButton_ACQ_VID);
QString strPushButton_AddCapture = QString(
"QPushButton \
{ \
background: #153B44; \
font-family: 'Roboto'; \
font-size: %1px; \
font-weight: bold; \
border-radius: 8px; \
color: white; \
} \
QPushButton:pressed \
{ \
background: #1B4C54; \
}").arg(nFontSizeButton-2);
ui->pushButton_AddCapture->setStyleSheet(strPushButton_AddCapture);
QString strInfoLabel = QString(
"QLabel \
{ \
font-family: 'Roboto'; \
font-size: %1px; \
font-weight: bold; \
color: #000000; \
}").arg(nFontInfoLabel);
ui->label_ID->setStyleSheet(strInfoLabel);
ui->label_Name->setStyleSheet(strInfoLabel);
ui->label_Birth->setStyleSheet(strInfoLabel);
ui->label_StudyDate->setStyleSheet(strInfoLabel);
QString strInfoInfo = QString(
"QLabel \
{ \
font-family: 'Roboto'; \
font-size: %1px; \
font-weight: normal; \
color: #000000; \
}").arg(nFontInfoInfo);
ui->info_ID->setStyleSheet(strInfoInfo);
ui->info_Name->setStyleSheet(strInfoInfo);
ui->info_Birth->setStyleSheet(strInfoInfo);
ui->info_StudyDate->setStyleSheet(strInfoInfo);
QString strVerticalScroll = QString(
"QScrollBar\n"
"{ \n"
"background: none; \n"
"border: none; \n"
"border-image: url(://image/scrollbar_vertical_bg.png); \n"
"} \n"
"QScrollBar:vertical { \n"
" background: white; \n"
" width: %1px; \n"
" margin: %1px 0px %1px 0px; \n"
"} \n"
"QScrollBar::handle:vertical { \n"
" background: none; \n"
" margin: 4px; \n"
" width: 18px; \n"
" min-height: 20px; \n"
" max-height: 20px; \n"
" height: 36px; \n"
" border-image: url(://image/ScrollBar_Vertical_Icon.png); \n"
"} \n"
"QScrollBar::add-line:vertical { \n"
" border: solid 1px black; \n"
" background: none; \n"
" border-image: url(://image/scrollbar_down.png); \n"
" height: %1px; \n"
" margin: 0px 0px; \n"
" subcontrol-position: bottom; \n"
" subcontrol-origin: margin; \n"
" border-bottom-left-radius: %2px; \n"
" border-bottom-right-radius: %2px; \n"
"} \n"
"QScrollBar::sub-line:vertical { \n"
" border: none; \n"
" background: none; \n"
" border-image: url(://image/scrollbar_up.png); \n"
" height: %1px; \n"
" subcontrol-position: top; \n"
" subcontrol-origin: margin; \n"
"}").arg(nScrollWidth).arg(nScrollWidth/2);
ui->verticalScrollBar->setStyleSheet(strVerticalScroll);
QString strVerticalFrame = QString(
"QFrame \n"
"{ \n"
" border: 1px solid black; \n"
" border-radius: %1px; \n"
"}").arg(nScrollWidth/2-2);
ui->frame_verticalScrollBar->setStyleSheet(strVerticalFrame);
}
void FormViewer::on_pushButton_DELETE_clicked()
{
CommonData* pCommonData = MainWindow::GetCommonData();
vector<ImageSelect*>* pListHistoryImage = pCommonData->GetListHistoryImage();
//vector<ImageSelect*> listHistory;
m_ListImageSelect.clear();
int i=0;
int nTotalImageCount = 0;
for(i=0 ; i<pListHistoryImage->size() ; i++)
{
ImageSelect* pImageSelect = (*pListHistoryImage)[i];
if(pImageSelect->m_bSelect==true)
{
QString strFile = pImageSelect->m_strFile;
QString strImageInstanceUID = pImageSelect->m_strImageInstanceUID;
if(pImageSelect->m_nType==DISPLAY_VIDEO)
{
QFileInfo fileCheck(strFile);
if(fileCheck.exists()==true)
{
QString strPath = fileCheck.path();
QString strFilename = fileCheck.fileName();
QStringList filter;
if(strFilename.size()>0)
{
strFilename = strFilename.left(strFilename.size()-4);
filter << strFilename + QString("*") + MOVIE_FILE_EXTENSION;
}
QDirIterator it(strPath, filter, QDir::AllEntries | QDir::NoSymLinks | QDir::NoDotAndDotDot, QDirIterator::NoIteratorFlags);
while(it.hasNext()==true)
{
QString strVideoFilename = it.next();
QFile fileDelete(strVideoFilename);
if(fileDelete.exists()==true)
{
fileDelete.remove();
fileDelete.close();
}
}
}
QFile fileDelete(strFile);
if(fileDelete.exists()==true)
{
fileDelete.remove();
fileDelete.close();
}
strFile.replace(".bmp", MOVIE_FILE_EXTENSION);
strFile.replace(".jpg", MOVIE_FILE_EXTENSION);
strFile.replace(".png", MOVIE_FILE_EXTENSION);
}
{
SUTIL::SDatabase db(QString("ImageDeleteTask_%1").arg(reinterpret_cast<quintptr>(this)));
if (db.OpenDatabase("/home/birdhead/test.db") == 0) // 0이 성공
{
// 2. 지역 인스턴스 'db'를 사용하여 안전하게 함수를 호출합니다.
// 리팩토링된 함수는 bool 값을 반환하므로, 성공 여부를 확인할 수 있습니다.
bool bSuccess = db.ImageDeleteFromImageInstanceUID(strImageInstanceUID, true);
if (bSuccess) {
qDebug() << "Successfully marked image for deletion:" << strImageInstanceUID;
} else {
qWarning() << "Failed to mark image for deletion:" << strImageInstanceUID;
}
}
else
{
qWarning() << "DB open failed for ImageDeleteTask.";
}
}
pImageSelect->DeleteImageData();
//pImageSelect->m_bDelete = true;
//delete pImageSelect->m_pImage;
}
else
{
nTotalImageCount++;
//listHistory.push_back(pImageSelect);
m_ListImageSelect.push_back(pImageSelect);
}
}
pListHistoryImage->clear();
for(i=0 ; i<m_ListImageSelect.size() ; i++)
{
ImageSelect* pImageSelect = m_ListImageSelect[i];
pListHistoryImage->push_back(pImageSelect);
}
pCommonData->ReleaseListHistoryImage();
if(nTotalImageCount!=m_nTotalImageCount)
{
SetTotalImageCount(nTotalImageCount);
m_nIndexCurrent = 0;
//ChangeViewMode(m_nMode);
ui->verticalScrollBar->setValue(0);
UpdateViewer();
}
}
void FormViewer::on_pushButton_AddCapture_clicked()
{
CommonData* pCommonData = MainWindow::GetCommonData();
SThreadImageSave* pThread = pCommonData->GetThreadCaptureImage();
int nCurrentState = pThread->GetCurrentState();
if(nCurrentState&0x08)
{
//Loading State
pThread->CancelLoad();
while(pThread->GetCurrentState()&0x08)
{
usleep(10*1000);
}
}
if(m_bExecMenu==false)
{
ACQUISITION_INFO* pAcquisitionInfo = pCommonData->GetAcquisitionInfo();
//vector<ImageSelect*>* pListHistoryImage = pCommonData->GetListHistoryImage();
HISTORY_STUDY* pHistoryStudy = pCommonData->GetCurrentHistoryStudy();
pAcquisitionInfo->GetPatientInfo()->strPatientAge = pHistoryStudy->pStrPatientAge->toStdString().c_str();
pAcquisitionInfo->GetPatientInfo()->strPatientID = pHistoryStudy->pStrPatientID->toStdString().c_str();
pAcquisitionInfo->GetPatientInfo()->strPatientName = pHistoryStudy->pStrPatientName->toStdString().c_str();
pAcquisitionInfo->GetPatientInfo()->strPatientSex = pHistoryStudy->pStrPatientSex->toStdString().c_str();
pAcquisitionInfo->GetPatientInfo()->strPatientBirthDate = pHistoryStudy->pStrPatientBirthDate->toStdString().c_str();
pAcquisitionInfo->GetPatientInfo()->strPatientLocation = pHistoryStudy->pStrPatientLocation->toStdString().c_str();
pAcquisitionInfo->GetStudyInfo()->nPatientIndex = pHistoryStudy->pStrPatientIndex->toInt();
pAcquisitionInfo->GetStudyInfo()->strStudyInstanceUID = pHistoryStudy->pStrStudyInstanceUID->toStdString().c_str();
pAcquisitionInfo->GetStudyInfo()->strStudyDate = pHistoryStudy->pStrStudyDate->toStdString().c_str();
pAcquisitionInfo->GetStudyInfo()->strStudyTime = pHistoryStudy->pStrStudyTime->toStdString().c_str();
pAcquisitionInfo->GetStudyInfo()->strAccessionNumber = pHistoryStudy->pStrAccessionNumber->toStdString().c_str();
pAcquisitionInfo->GetStudyInfo()->strStudyDescription = pHistoryStudy->pStrStudyDescription->toStdString().c_str();
pAcquisitionInfo->GetStudyInfo()->strReferringPhysiciansName = pHistoryStudy->pStrReferringPhysiciansName->toStdString().c_str();
pAcquisitionInfo->GetSeriesInfo()->strSeriesInstanceUID = pHistoryStudy->pStrSeriesInstanceUID->toStdString().c_str();
pAcquisitionInfo->GetSeriesInfo()->strModality = pHistoryStudy->pStrModality->toStdString().c_str();
pAcquisitionInfo->GetSeriesInfo()->strSeriesDate = pHistoryStudy->pStrSeriesDate->toStdString().c_str();
pAcquisitionInfo->GetSeriesInfo()->strSeriesTime = pHistoryStudy->pStrSeriesTime->toStdString().c_str();
pAcquisitionInfo->GetSeriesInfo()->strSeriesDescription = pHistoryStudy->pStrSeriesDescription->toStdString().c_str();
pAcquisitionInfo->GetSeriesInfo()->strOperatorsName = pHistoryStudy->pStrOperatorsName->toStdString().c_str();
pAcquisitionInfo->GetSeriesInfo()->nSeriesNumber = pHistoryStudy->pStrSeriesNumber->toInt();
pAcquisitionInfo->m_nIndexStudy = pHistoryStudy->pStrStudyIndex->toInt();
{
SUTIL::SDatabase db(QString("GetSeriesIndices_Task_%1").arg(reinterpret_cast<quintptr>(this)));
if (db.OpenDatabase("/home/birdhead/test.db") == 0) // 0이 성공
{
// 2. 지역 인스턴스 'db'를 사용하여 안전하게 함수를 호출합니다.
// Get...Index... 함수들은 이전에 리팩토링되어 이미 안전합니다.
// pStrStudyInstanceUID가 QString* 이므로 역참조(*)하여 const QString& 타입으로 전달합니다.
pAcquisitionInfo->m_nIndexSeries_Image = db.GetSeriesImageIndexWithInstanceUID(*pHistoryStudy->pStrStudyInstanceUID);
pAcquisitionInfo->m_nIndexSeries_Video = db.GetSeriesVideoIndexWithInstanceUID(*pHistoryStudy->pStrStudyInstanceUID);
}
else
{
qWarning() << "DB open failed for GetSeriesIndices task.";
// 기본값으로 초기화
pAcquisitionInfo->m_nIndexSeries_Image = 0;
pAcquisitionInfo->m_nIndexSeries_Video = 0;
}
}
pAcquisitionInfo->m_nIndexPatient = pHistoryStudy->pStrPatientIndex->toInt();
pAcquisitionInfo->m_nAcquisitionImageMax = pHistoryStudy->pStrImageCount->toInt();
pAcquisitionInfo->m_nAcquisitionVideoMax = pHistoryStudy->pStrMovieCount->toInt();
//pAcquisitionInfo->m_nAcuqisitionMax = pDatabase->GetImageMaxIndex(pHistoryStudy->pStrSeriesInstanceUID);
pCommonData->ReleaseCurrentHistoryStudy();
pCommonData->ReleaseAcquisitionInfo();
m_bExecMenu = true;
//ExecuteCapture();
pCommonData->AddCaptureImageWithHistory();
ChangeMenu(SMENU_CAPTURE);
}
}
void FormViewer::ImageLoadComplete()
{
ui->pushButton_AddCapture->show();
ui->pushButton_DELETE->show();
ui->pushButton_SEND->show();
}