#include "WindowAppGvlView.h"
#include "DialogNewVariable.h"
#include "DialogNewDBVariable.h"
#include "DialogDBOption.h"
#include "GvlManager.h"
#include "PouManager.h"
//// 列数
//#define GVL_COLUMN_COUNT 6
//// 表示正确状态的颜色
//#define COLOR_ITEM_OK qRgb(198,239,206)
//#define COLOR_ITEM_ERROR qRgb(255,199,206)
WindowAppGvlView::WindowAppGvlView(const QString& strTitle, GVL_MODE gvlType, DllTool* pHdwTool, QWidget *parent)
: QWidget(parent)
, m_strTitle(strTitle)
, m_gvlType(gvlType)
, m_pHdwTool(pHdwTool)
{
ui.setupUi(this);
// 初始化工具栏
this->initToolbar();
// 初始化变量表格
ui.tableVariable->initTable(m_strTitle, m_gvlType);
// UI元素初始化
this->initUI();
// 2022-3-2增加,创建变量表格的同时就顺便创建对应的全局变量组(空)
g_pGvlManager->addNewGroup(m_strTitle, TOOL_TYPE::TOOL_TYPE_GLOBAL_VARIABLE, gvlType);
#ifdef DEBUG_ON_GVL
VARIABLE* pNewVariable = new VARIABLE(
m_strTitle,
true,
"abcd", "QString", "xxxxx", "Comment1"
);
this->addNewVariable(pNewVariable);
pNewVariable = new VARIABLE(
m_strTitle,
true, "int_test1", "int", "100", "Comment2"
);
this->addNewVariable(pNewVariable);
pNewVariable = new VARIABLE(
m_strTitle,
true, "int_test2", "int", "200", "This value is 200."
);
this->addNewVariable(pNewVariable);
pNewVariable = new VARIABLE(
m_strTitle,
true, "abcdfg", "bool", "true", "Comment3"
);
this->addNewVariable(pNewVariable);
pNewVariable = new VARIABLE(
m_strTitle,
true, "double_test", "double", "765.4321", "This is a double variable"
);
this->addNewVariable(pNewVariable);
//// 2022-2-15 尝试增加Pou内部变量(测试)
//pNewVariable = new VARIABLE(
// m_strTitle,
// false,
// "counter1",
// "int", "1", "This is a internal variable", false
//);
//this->addNewVariable(pNewVariable);
//pNewVariable = new VARIABLE(
// m_strTitle,
// false,
// "counter2",
// "int", "100", "This is a internal variable", false
//);
//this->addNewVariable(pNewVariable);
#endif
}
WindowAppGvlView::~WindowAppGvlView()
{
}
///
/// 在界面中添加新的变量(from序列化文件)
///
///
void WindowAppGvlView::addNewVariable(VARIABLE* pNewVariable)
{
// 2022-2-15增加,内部变量不需要显示在界面中
if (pNewVariable->bShow)
{
if (m_gvlType == GVL_MODE::GVL_BASIC ||
m_gvlType == GVL_MODE::GVL_STANDARD)
{
// 界面中添加新的一行
ui.tableVariable->insertTableLine(
pNewVariable->bSerialized,
pNewVariable->strName,
pNewVariable->strFullName,
Utility::getTypeString(pNewVariable->value.type),
Utility::getValueString(pNewVariable->value.Ptr, pNewVariable->value.type),
pNewVariable->strComment
);
}
else
{
// 2022-3-2 ,如果是DB变量,首先要进行有效性检查,需要确保之前绑定了硬件工具指针
Q_ASSERT(pNewVariable->parent() != nullptr);
// Q_ASSERT(pNewVariable->pOriginalTool != nullptr);
// Q_ASSERT(pNewVariable->pOriginalTool->pHdwDllPtr != nullptr);
//if (m_gvlType == GVL_MODE::GVL_DB
// && pNewVariable->pOriginalTool->pHdwDllPtr == nullptr)
//{
// qDebug() << "[Error] WindowAppGvlView::addNewVariable - Insert new DB variable, but pHdwDllPtr is nullptr.";
// return;
//}
// DB变量需要添加更多的信息
// 界面中添加新的一行
ui.tableVariable->insertTableLine(
pNewVariable->strName,
pNewVariable->strFullName,
Utility::getTypeString(pNewVariable->value.type),
Utility::getValueString(pNewVariable->value.Ptr, pNewVariable->value.type),
pNewVariable->strCommAddress,
pNewVariable->accessMode,
pNewVariable->strComment
);
}
// 绑定新的变量和界面对应关系,方便变更之后及时发送通知
g_pGvlManager->bindUIAndVariable(ui.tableVariable, pNewVariable->strFullName);
}
}
///
///
///
///
void WindowAppGvlView::showEvent(QShowEvent* event)
{
Q_UNUSED(event);
QString str = "绑定对象: ";
if (m_gvlType == GVL_MODE::GVL_DB)
{
POU* pHdwPou = g_pPouManager->getHdwPou();
TOOL* pTool = pHdwPou->GetToolByName(m_strHdwInstName);
if (pTool == nullptr)
{
qWarning() << m_strHdwInstName << " not found in hardware configuration ";
}
if (pTool != nullptr)
{
ui.label->setText(str + m_strHdwInstName);
ui.label->setStyleSheet("background-color:rgb(70,70,70);");
}
else
{
ui.label->setStyleSheet("background-color:red;");
ui.label->setText(str + " not found in hardware configuration ");
}
}
else
{
ui.label->setText(str + "系统");
ui.label->setStyleSheet("QLabel{background-color:rgb(70,70,70);}");
}
}
///
/// UI元素初始化
///
void WindowAppGvlView::initUI()
{
// 放进Layout中
QVBoxLayout* viewLayout = new QVBoxLayout();
viewLayout->addWidget(m_Toolbar);
viewLayout->addWidget(ui.tableVariable);
viewLayout->addWidget(ui.label);
viewLayout->setContentsMargins(0, 0, 0, 24);
viewLayout->setSpacing(0);
this->setLayout(viewLayout);
// ui.tableVariable->setShowGrid(false);
// ui.tableVariable->setStyleSheet(
// "QTableWidget::Item{border:0px solid rgb(255,0,0);"
// "border-bottom:1px solid rgb(255,0,0);}"
// );
if (m_gvlType == GVL_MODE::GVL_DB)
{
if (m_pHdwTool != nullptr)
{
m_strHdwInstName = m_pHdwTool->getInstanceName();
}
}
}
///
/// 初始化工具栏
///
void WindowAppGvlView::initToolbar()
{
m_Toolbar = new QToolBar(this);
m_Toolbar->setToolButtonStyle(Qt::ToolButtonIconOnly);
QAction* actionNew = new QAction(QIcon(":/image/New.png"), ("New"));
QAction* actionMoveUp = new QAction(QIcon(":/image/Up.png"), ("Move up"));
QAction* actionMoveDown = new QAction(QIcon(":/image/Down.png"), ("Move down"));
QAction* actionDel = new QAction(QIcon(":/image/Del.png"), ("Delete"));
QAction* actionOption = new QAction(QIcon(":/image/Option.png"), ("Options"));
m_Toolbar->addAction(actionNew);
m_Toolbar->addSeparator();
m_Toolbar->addAction(actionMoveUp);
m_Toolbar->addAction(actionMoveDown);
m_Toolbar->addSeparator();
m_Toolbar->addAction(actionDel);
if (m_gvlType == GVL_MODE::GVL_DB)
{
m_Toolbar->addSeparator();
m_Toolbar->addAction(actionOption);
}
// 增加工具栏的消息响应
connect(actionNew, &QAction::triggered, this, &WindowAppGvlView::onTagNew);
connect(actionMoveUp, &QAction::triggered, this, &WindowAppGvlView::onTagMoveUp);
connect(actionMoveDown, &QAction::triggered, this, &WindowAppGvlView::onTagMoveDown);
connect(actionDel, &QAction::triggered, this, &WindowAppGvlView::onTagDelete);
connect(actionOption, &QAction::triggered, this, &WindowAppGvlView::onOption);
// 设置为白色背景色
//m_Toolbar->setStyleSheet("background-color:rgb(255,255,255)");
m_Toolbar->setIconSize(QSize(14, 14));
}
///
/// Toolbar - New
///
void WindowAppGvlView::onTagNew()
{
// 添加基础和标准模式变量
if (m_gvlType != GVL_MODE::GVL_DB)
{
onToolNewStandard();
}
// 添加DB模式变量
else
{
onToolNewDB();
}
}
///
/// 添加基础和标准模式变量
///
void WindowAppGvlView::onToolNewStandard()
{
// 弹出新增变量对话框
DialogNewVariable dlgNewVar(m_gvlType, this);
dlgNewVar.setWindowModality(Qt::WindowModal);
dlgNewVar.setGroup(this->m_strTitle);
dlgNewVar.setTagNumber(ui.tableVariable->rowCount());
int res = dlgNewVar.exec();
if (res != QDialog::Accepted)
{
return;
}
// 根据用户输入构造新的变量
VARIABLE* pNewVariable = new VARIABLE(
m_strTitle,
dlgNewVar.m_bSerialized,
dlgNewVar.m_strName,
dlgNewVar.m_strType,
dlgNewVar.m_strValue,
dlgNewVar.m_strComment,
g_pGvlManager->getVariablesCountByGroup(m_strTitle),
true
);
// 数据结构中添加本变量信息
g_pGvlManager->addNewVariable( m_strTitle, pNewVariable );
// 在界面中添加新变量
this->addNewVariable(pNewVariable);
}
///
/// 添加DB模式变量
///
void WindowAppGvlView::onToolNewDB()
{
DialogNewDBVariable dlgNewDb(this);
dlgNewDb.setGroup(this->m_strTitle);
dlgNewDb.setTagNumber(ui.tableVariable->rowCount());
int res = dlgNewDb.exec();
if (res != QDialog::Accepted)
{
return;
}
// 计算这个新变量的索引序号
int nIndex = g_pGvlManager->getVariablesCountByGroup(m_strTitle);
// 根据用户输入构造新的变量(构造DB变量会多三个参数)
VARIABLE* pNewVariable = new VARIABLE(
m_strTitle,
false,
dlgNewDb.m_strName,
dlgNewDb.m_strType,
dlgNewDb.m_strValue,
dlgNewDb.m_strComment,
nIndex,
true,
dlgNewDb.m_bTrigger,
dlgNewDb.m_strCommAddress,
dlgNewDb.m_accessMode
);
// 数据结构中添加本变量信息
g_pGvlManager->addNewVariable(m_strTitle, pNewVariable);
// 在界面中添加新变量
this->addNewVariable(pNewVariable);
}
///
/// Toolbar - MoveUp
///
void WindowAppGvlView::onTagMoveUp()
{
// qDebug() << "WindowAppGvlView::onToolMoveUp";
ui.tableVariable->onVariableMoveUp();
}
///
/// Toolbar - MoveDown
///
void WindowAppGvlView::onTagMoveDown()
{
// qDebug() << "WindowAppGvlView::onToolMoveDown";
ui.tableVariable->onVariableMoveDown();
}
///
/// Toolbar - Delete
///
void WindowAppGvlView::onTagDelete()
{
ui.tableVariable->onVariableDelete();
}
///
/// Toolbar - Option
///
void WindowAppGvlView::onOption()
{
vDebug() << "WindowAppGvlView::onOption()";
//DialogDBOption dlgDbOption(this);
//int res = dlgDbOption.exec();
//Q_UNUSED(res);
}