#include "DialogWait.h"
#include "Common.h"
#include "Utility"
#include "DialogWaitSelection.h"
DialogWait::DialogWait(
VARIABLE* var,
bool skipWait,
VALUE* waitValue,
int nTimeout,
QWidget *parent
)
: QDialog(parent)
, m_selVariable(var)
, m_tmpSelection(nullptr)
, m_WaitValue(waitValue)
, m_nTimeout(nTimeout)
, m_bSkipWait(skipWait)
{
ui.setupUi(this);
// 对话框初始化
this->initUI();
}
DialogWait::~DialogWait()
{
}
///
/// 对话框初始化
///
void DialogWait::initUI()
{
this->setWindowTitle(("WaitTool Option"));
// 设置对话框风格
this->setAttribute(Qt::WA_QuitOnClose);
this->setWindowModality(Qt::ApplicationModal);
// 初始化绑定显示
if (m_selVariable != nullptr)
{
ui.editEvent->setText(m_selVariable->strFullName);
}
// 设置Edit控件不可编辑
ui.editEvent->setReadOnly(true);
// 默认跳过单步执行时的等待
ui.checkWait->setChecked(m_bSkipWait);
// 默认的等待超时时间
ui.editTimeOut->setText(QString::number(m_nTimeout));
// 初始化WaitValue相关界面
this->initWaitValueControls();
// 槽函数
connect(ui.okButton, SIGNAL(clicked()), this, SLOT(onButtonOKClicked()));
connect(ui.buttonSel, SIGNAL(clicked()), this, SLOT(onButtonSelClicked()));
connect(ui.cancelButton, SIGNAL(clicked()), this, SLOT(reject()));
// 设置固定窗体大小
this->setFixedSize(363, 315);
}
///
/// 根据用户上一轮设置的WaitValue初始化界面
///
bool DialogWait::initWaitValueControls()
{
// 值类型ComboBox(目前只支持int、bool、String)
ui.comboType->addItem(Utility::getTypeString(VALUE_TYPE::Type_Int));
ui.comboType->addItem(Utility::getTypeString(VALUE_TYPE::Type_Bool));
ui.comboType->addItem(Utility::getTypeString(VALUE_TYPE::Type_String));
//如果尚未初始化,则显示默认值
if (m_WaitValue->type == VALUE_TYPE::Type_Unknown)
{
ui.comboType->setCurrentIndex(0);
ui.editValue->setText("");
return true;
}
// 否则根据初始化的值来显示
if (m_WaitValue->type == VALUE_TYPE::Type_Int)
{
ui.comboType->setCurrentIndex(0);
}
else if (m_WaitValue->type == VALUE_TYPE::Type_Bool)
{
ui.comboType->setCurrentIndex(1);
}
else if (m_WaitValue->type == VALUE_TYPE::Type_String)
{
ui.comboType->setCurrentIndex(2);
}
else
{
vDebug() << "[Error] Unsupported WaitValue init type: " << m_WaitValue->type;
return false;
}
// 显示WaitValue的默认值
ui.editValue->setText(m_WaitValue->toString());
return true;
}
///
/// OK按钮
///
void DialogWait::onButtonOKClicked()
{
if (ui.editEvent->text().isEmpty())
{
CRITICAL_MESSAGE("Please select variable first!");
return;
}
// 获取用户输入
// (增加这个判断,是为了防止用户没有点击选择框就直接点击保存的情况,此时针对用户的选择就不做改变)
if (m_tmpSelection)
{
m_selVariable = m_tmpSelection;
}
// 获取用户设置的等待超时
if (ui.editTimeOut->text().toInt() < 0)
{
CRITICAL_MESSAGE("Timeout is invalid.");
return;
}
// 保存用户设置的等待变量
bool bSave = this->saveWaitValue();
// 保存等待变量异常
if (!bSave)
{
return;
}
// 用户设置的超时时间
m_nTimeout = ui.editTimeOut->text().toInt();
// 是否跳过等待
m_bSkipWait = ui.checkWait->isChecked();
this->accept();
}
///
/// 将用户输入的等待变量转换成VARIABLE*保存
///
bool DialogWait::saveWaitValue()
{
QString typeText = ui.comboType->currentText();
QString valueText = ui.editValue->text();
// 如果用户留空,那么则把数值清空
if (valueText.isEmpty())
{
m_WaitValue->clear();
return true;
}
// 然后,只有DB类型的变量才可以输入等待数值
if (m_selVariable->parent()->gvlMode != GVL_MODE::GVL_DB)
{
CRITICAL_MESSAGE(" Setting wait value is only supported by DB type.");
return false;
}
// 否则需要首先检查等待变量的类型和绑定变量的类型是否一致
if (typeText != Utility::getTypeString(m_selVariable->value.type))
{
CRITICAL_MESSAGE("Wait value type is diffrent with selected value.");
return false;
}
// Int
if (typeText == Utility::getTypeString(VALUE_TYPE::Type_Int))
{
int nValue = valueText.toInt();
m_WaitValue->type = VALUE_TYPE::Type_Int;
m_WaitValue->setValue(nValue);
}
// Bool
else if (typeText == Utility::getTypeString(VALUE_TYPE::Type_Bool))
{
bool bValue;
if (valueText == STRING_TRUE)
{
bValue = true;
}
else
{
bValue = false;
}
m_WaitValue->type = VALUE_TYPE::Type_Bool;
m_WaitValue->setValue(bValue);
}
// String
else if (typeText == Utility::getTypeString(VALUE_TYPE::Type_String))
{
m_WaitValue->type = VALUE_TYPE::Type_String;
m_WaitValue->setValue(valueText);
}
// Error
else
{
vDebug() << "[Error] Unsupported WaitValue type: " << typeText;
CRITICAL_MESSAGE("Wait value is invalid.");
return false;
}
vDebug() << " Set wait value = " << m_WaitValue->toString();
return true;
}
///
/// ... 按钮
///
void DialogWait::onButtonSelClicked()
{
DialogWaitSelection dialogWaitSel;
if (dialogWaitSel.exec() == DialogWaitSelection::Accepted)
{
// 临时保存,用户选择的变量
this->m_tmpSelection = dialogWaitSel.m_selVariable;
// 显示用户的选择
ui.editEvent->setText(this->m_tmpSelection->strFullName);
}
}