2021-10-09 16:38:34 +08:00
//
// Created by Krad on 2021/10/8.
//
# 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>
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"
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 ;
}
2022-06-29 09:56:13 +08:00
ScanFormWidget : : ScanFormWidget ( QWidget * parent )
2022-06-14 17:15:23 +08:00
: TabFormWidget ( parent )
, mPatInf ( new PatientInformationForm ( this ) )
, mLblProtocol ( new QLabel ( this ) )
, mBtnLeft ( new QToolButton ( this ) )
, mBtnRight ( new QToolButton ( this ) )
2023-09-25 10:56:25 +08:00
, mBtnEScan ( new QToolButton ( this ) )
2022-06-14 17:15:23 +08:00
, mBtnPreview ( new QToolButton ( this ) )
, mBtnStop ( new QToolButton ( this ) )
, mBtnScan ( new QToolButton ( this ) )
2023-03-28 14:10:32 +08:00
, mBtnDrainage ( new QToolButton ( this ) )
2022-06-14 17:15:23 +08:00
, mViewer ( new QLabel ( this ) )
, mLblPreview ( new QLabel ( this ) )
, mLblE ( new QLabel ( this ) )
, mLblParams ( new QLabel ( this ) )
, mLblE2 ( new QLabel ( this ) )
{
2022-07-12 16:13:09 +08:00
2022-07-14 16:59:30 +08:00
auto layout = new QHBoxLayout ( ui - > commandWidget ) ;
2022-06-14 17:15:23 +08:00
initProtocolUI ( layout ) ;
layout - > addSpacerItem ( new QSpacerItem ( 20 , 20 , QSizePolicy : : Expanding ) ) ;
2022-06-14 11:29:56 +08:00
addVerticalLine ( layout ) ;
2022-06-14 17:15:23 +08:00
initScanControlBar ( layout ) ;
initScanContent ( ) ;
2022-06-29 09:56:13 +08:00
initEvents ( ) ;
2021-12-28 18:23:02 +08:00
2021-10-09 16:38:34 +08:00
}
2022-06-14 17:15:23 +08:00
void ScanFormWidget : : initProtocolUI ( QHBoxLayout * layout ) {
mLblProtocol - > setText ( tr ( " Protocol " ) ) ;
mLblProtocol - > setAlignment ( Qt : : AlignTop ) ;
2022-07-12 16:13:09 +08:00
mLblProtocol - > setObjectName ( " protocolPanelTitle " ) ;
2022-06-14 17:15:23 +08:00
layout - > addWidget ( mLblProtocol ) ;
addVerticalLine ( layout ) ;
2022-07-14 16:59:30 +08:00
mBtnLeft - > setObjectName ( " btnLeft " ) ;
mBtnRight - > setObjectName ( " btnRight " ) ;
2022-06-14 17:15:23 +08:00
mBtnLeft - > setText ( tr ( " LEFT " ) ) ;
mBtnRight - > setText ( tr ( " RIGHT " ) ) ;
2022-07-14 16:59:30 +08:00
layout - > addWidget ( mBtnLeft ) ;
layout - > addWidget ( mBtnRight ) ;
2022-06-14 17:15:23 +08:00
2022-07-14 16:59:30 +08:00
auto group = new QButtonGroup ( ui - > commandWidget ) ;
2022-06-14 17:15:23 +08:00
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 ( ) {
2022-06-29 09:56:13 +08:00
auto contentLayout = new QHBoxLayout ( ) ;
2022-06-14 17:15:23 +08:00
ui - > contentWidget - > setLayout ( contentLayout ) ;
contentLayout - > addWidget ( mPatInf ) ;
2022-07-12 16:13:09 +08:00
auto paramWidget = new QWidget ( this ) ;
auto broadcastWidget = new QWidget ( this ) ;
broadcastWidget - > setObjectName ( " broadcastWidget " ) ;
2022-06-14 17:15:23 +08:00
mViewer - > setObjectName ( " viewer " ) ;
mViewer - > setFixedSize ( 800 , 800 ) ;
mViewer - > setText ( " " ) ;
2022-06-29 09:56:13 +08:00
auto viewerLayout = new QHBoxLayout ( mViewer ) ;
2022-07-12 16:13:09 +08:00
broadcastWidget - > setLayout ( viewerLayout ) ;
2022-06-14 17:15:23 +08:00
viewerLayout - > addWidget ( mViewer ) ;
2022-07-12 16:13:09 +08:00
contentLayout - > addWidget ( broadcastWidget ) ;
2022-07-14 09:57:05 +08:00
paramWidget - > setObjectName ( " paramWidget " ) ;
2022-07-12 16:13:09 +08:00
auto paramLayout = new QVBoxLayout ( paramWidget ) ;
2022-06-14 17:15:23 +08:00
mLblPreview - > setText ( tr ( " Preview Parameters " ) ) ;
2022-07-12 16:13:09 +08:00
mLblPreview - > setObjectName ( " parameterTitle " ) ;
2022-06-14 17:15:23 +08:00
paramLayout - > addWidget ( mLblPreview ) ;
mLblE - > setWordWrap ( true ) ;
2022-07-12 16:13:09 +08:00
mLblE - > setObjectName ( " placeholder " ) ;
2022-06-14 17:15:23 +08:00
mLblE - > setText ( tr ( " some settings \n \n parameters \n " ) ) ;
paramLayout - > addWidget ( mLblE ) ;
2022-06-29 09:56:13 +08:00
auto lbl_end = new QLabel ( this ) ;
2022-07-12 16:13:09 +08:00
lbl_end - > setObjectName ( " endSpaceLine " ) ;
2022-06-14 17:15:23 +08:00
paramLayout - > addWidget ( lbl_end ) ;
mLblParams - > setText ( tr ( " Scan Parameters " ) ) ;
2022-07-12 16:13:09 +08:00
mLblParams - > setObjectName ( " parameterTitle " ) ;
2022-06-14 17:15:23 +08:00
paramLayout - > addWidget ( mLblParams ) ;
mLblE2 - > setWordWrap ( true ) ;
2022-07-12 16:13:09 +08:00
mLblE2 - > setObjectName ( " placeholder " ) ;
2022-06-14 17:15:23 +08:00
mLblE2 - > setText ( tr ( " some settings \n \n parameters \n " ) ) ;
paramLayout - > addWidget ( mLblE2 ) ;
2022-06-29 09:56:13 +08:00
auto lbl_end2 = new QLabel ( this ) ;
2022-07-12 16:13:09 +08:00
lbl_end2 - > setObjectName ( " endSpaceLine " ) ;
2022-06-14 17:15:23 +08:00
paramLayout - > addWidget ( lbl_end2 ) ;
paramLayout - > addSpacerItem ( new QSpacerItem ( 20 , 20 , QSizePolicy : : Minimum , QSizePolicy : : Expanding ) ) ;
2022-07-12 16:13:09 +08:00
contentLayout - > addWidget ( paramWidget ) ;
2022-06-14 17:15:23 +08:00
}
void ScanFormWidget : : initScanControlBar ( QHBoxLayout * layout ) {
2023-09-25 10:56:25 +08:00
mBtnEScan - > setObjectName ( " btnRefresh " ) ;
2022-07-14 16:59:30 +08:00
mBtnPreview - > setObjectName ( " btnPreview " ) ;
mBtnStop - > setObjectName ( " btnStop " ) ;
mBtnScan - > setObjectName ( " btnScan " ) ;
2023-03-28 14:10:32 +08:00
mBtnDrainage - > setObjectName ( " btnDrainage " ) ;
mBtnDrainage - > setCheckable ( true ) ;
2022-06-14 17:15:23 +08:00
2023-09-25 10:56:25 +08:00
mBtnEScan - > setText ( tr ( " Empty Scan " ) ) ;
2022-06-14 17:15:23 +08:00
mBtnPreview - > setText ( tr ( " Preview " ) ) ;
mBtnStop - > setText ( tr ( " Stop " ) ) ;
mBtnScan - > setText ( tr ( " Scan " ) ) ;
2023-03-28 14:10:32 +08:00
mBtnDrainage - > setText ( tr ( " Drainage " ) ) ;
2021-10-09 16:38:34 +08:00
2022-06-14 17:15:23 +08:00
mBtnScan - > setEnabled ( false ) ;
2023-09-25 10:56:25 +08:00
mBtnEScan - > setEnabled ( false ) ;
2022-06-14 17:15:23 +08:00
mBtnPreview - > setEnabled ( false ) ;
mBtnStop - > setEnabled ( false ) ;
2022-07-14 16:59:30 +08:00
2023-09-25 10:56:25 +08:00
layout - > addWidget ( mBtnEScan ) ;
2022-07-14 16:59:30 +08:00
layout - > addWidget ( mBtnPreview ) ;
layout - > addWidget ( mBtnStop ) ;
2022-07-20 16:45:33 +08:00
layout - > addWidget ( mBtnScan ) ;
2023-03-28 14:10:32 +08:00
layout - > addWidget ( mBtnDrainage ) ;
2023-09-25 10:56:25 +08:00
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 ;
2022-06-14 17:15:23 +08:00
QString patientInf ( mPatInf - > getCurrentPatientJsonString ( true ) ) ;
2023-09-05 14:27:30 +08:00
LOG_USER_OPERATION ( " Start Empty Scan " )
2022-06-14 17:15:23 +08:00
EventCenter : : Default ( ) - > triggerEvent ( RequestEmptyScan , nullptr , ( QObject * ) ( & patientInf ) ) ;
} ) ;
connect ( mBtnPreview , & QToolButton : : clicked , [ = ] ( ) {
2023-09-05 14:27:30 +08:00
LOG_USER_OPERATION ( QString ( " Start Preview, ID: %1 " ) . arg ( mPatInf - > getPatientID ( ) ) )
2022-06-14 17:15:23 +08:00
EventCenter : : Default ( ) - > triggerEvent ( RequestPreviewScan , nullptr , nullptr ) ;
2023-09-25 10:56:25 +08:00
2022-06-14 17:15:23 +08:00
} ) ;
2023-09-05 14:27:30 +08:00
connect ( DeviceManager : : Default ( ) , & DeviceManager : : startPreviewScanResult , [ this ] ( bool aIsSucessful )
{
if ( ! aIsSucessful )
{
setPreviewing ( false ) ;
}
} ) ;
connect ( DeviceManager : : Default ( ) , & DeviceManager : : startPumpControlResult , [ this ] ( bool aIsSucessful )
{
if ( ! aIsSucessful )
{
bool isChecked = mBtnDrainage - > isChecked ( ) ;
mBtnDrainage - > setChecked ( ! isChecked ) ;
if ( isChecked )
{
mBtnDrainage - > setText ( tr ( " Drainage " ) ) ;
}
else
{
mBtnDrainage - > setText ( tr ( " Drainaging " ) ) ;
}
}
} ) ;
2022-06-14 17:15:23 +08:00
connect ( mBtnScan , & QToolButton : : clicked , [ = ] ( ) {
2023-09-08 17:09:49 +08:00
if ( JsonObject : : Instance ( ) - > getScanConfirm ( ) )
{
int ret = DialogManager : : Default ( ) - > requestPatientConfirm ( mPatInf - > getPatientInformation ( ) , mPatInf - > getProtocol ( ) ) ;
if ( ret ! = QDialog : : Accepted ) return ;
}
2022-06-14 17:15:23 +08:00
QString patientInf ( mPatInf - > getCurrentPatientJsonString ( false ) ) ;
2023-09-05 14:27:30 +08:00
LOG_USER_OPERATION ( QString ( " Start Scan, ID: %1 " ) . arg ( mPatInf - > getPatientID ( ) ) )
2023-08-21 14:22:41 +08:00
if ( ! DeviceManager : : Default ( ) - > hasValidEmptyScan ( ) ) {
2022-06-14 17:15:23 +08:00
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 , [ = ] ( ) {
2023-09-05 14:27:30 +08:00
LOG_USER_OPERATION ( " Stop Preview " )
2023-08-21 14:22:41 +08:00
EventCenter : : Default ( ) - > triggerEvent ( RequestPreviewStop , nullptr , nullptr ) ;
2022-06-14 17:15:23 +08:00
} ) ;
2023-08-31 15:44:11 +08:00
connect ( mBtnDrainage , & QToolButton : : clicked , [ = ] ( bool aSatus ) {
2023-03-28 14:10:32 +08:00
//Drainage
if ( aSatus = = true )
{
2023-08-31 15:44:11 +08:00
QString code = " 1 " ;
2023-03-28 14:10:32 +08:00
mBtnDrainage - > setText ( tr ( " Drainaging " ) ) ;
2023-08-31 15:44:11 +08:00
EventCenter : : Default ( ) - > triggerEvent ( RequestDrainage , nullptr , ( QObject * ) ( & code ) ) ;
2023-09-05 14:27:30 +08:00
LOG_USER_OPERATION ( " Perform Drainage " ) ;
2023-03-28 14:10:32 +08:00
}
else
{
2023-08-31 15:44:11 +08:00
QString code = " 0 " ;
2023-03-28 14:10:32 +08:00
mBtnDrainage - > setText ( tr ( " Drainage " ) ) ;
2023-08-31 15:44:11 +08:00
EventCenter : : Default ( ) - > triggerEvent ( RequestDrainage , nullptr , ( QObject * ) ( & code ) ) ;
2023-09-05 14:27:30 +08:00
LOG_USER_OPERATION ( " Stop Drainage " ) ;
2023-03-28 14:10:32 +08:00
}
} ) ;
2021-10-09 16:38:34 +08:00
}
2021-10-12 17:43:12 +08:00
void ScanFormWidget : : protocolChanged ( int type ) {
2022-06-14 17:15:23 +08:00
mPatInf - > setProtocol ( 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
void ScanFormWidget : : setPreviewing ( bool val ) {
2022-06-14 17:15:23 +08:00
mViewer - > setVisible ( val ) ;
mBtnPreview - > setCheckable ( val ) ;
mBtnPreview - > setChecked ( val ) ;
mBtnPreview - > setEnabled ( ! val ) ;
2023-09-25 10:56:25 +08:00
mBtnEScan - > setEnabled ( ! val ) ;
2022-06-14 17:15:23 +08:00
mBtnScan - > setEnabled ( ! val ) ;
2023-09-25 10:56:25 +08:00
mBtnDrainage - > setEnabled ( ! val ) ;
2022-06-14 17:15:23 +08:00
}
void ScanFormWidget : : renderLoading ( ) {
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 ) ;
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 ) ;
}
2023-08-21 14:22:41 +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 ) ;
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 ) ;
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 " ) ;
mViewer - > setPixmap ( pic ) ;
2022-06-29 09:56:13 +08:00
}
void ScanFormWidget : : initEvents ( ) { //Events---------------------------------------------------------------
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
{
mBtnScan - > setEnabled ( true ) ;
2023-09-25 10:56:25 +08:00
mBtnEScan - > setEnabled ( true ) ;
2022-06-29 09:56:13 +08:00
mBtnPreview - > setEnabled ( true ) ;
mBtnStop - > setEnabled ( true ) ;
2023-09-15 11:42:40 +08:00
}
else {
mBtnScan - > setEnabled ( false ) ;
2023-09-25 10:56:25 +08:00
mBtnEScan - > setEnabled ( false ) ;
2023-09-15 11:42:40 +08:00
mBtnPreview - > setEnabled ( false ) ;
mBtnStop - > setEnabled ( false ) ;
2022-06-29 09:56:13 +08:00
}
mPatInf - > setPatientInformation ( ( PatientInformation * ) data ) ;
} ) ;
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
}
void ScanFormWidget : : reloadLanguage ( ) {
mBtnLeft - > setText ( tr ( " LEFT " ) ) ;
mBtnRight - > setText ( tr ( " RIGHT " ) ) ;
2023-09-25 10:56:25 +08:00
mBtnEScan - > setText ( tr ( " Empty Scan " ) ) ;
2022-06-14 17:15:23 +08:00
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 \n parameters \n " ) ) ;
mLblE2 - > setText ( tr ( " some settings \n \n parameters \n " ) ) ;
2023-03-28 14:10:32 +08:00
mBtnDrainage - > isChecked ( ) ? mBtnDrainage - > setText ( tr ( " Drainaging " ) ) : mBtnDrainage - > setText ( tr ( " Drainage " ) ) ;
2021-10-13 17:36:38 +08:00
}