WindowAppGvlView.cpp 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419
  1. #include "WindowAppGvlView.h"
  2. #include "DialogNewVariable.h"
  3. #include "DialogNewDBVariable.h"
  4. #include "DialogDBOption.h"
  5. #include "GvlManager.h"
  6. #include "PouManager.h"
  7. //// 列数
  8. //#define GVL_COLUMN_COUNT 6
  9. //// 表示正确状态的颜色
  10. //#define COLOR_ITEM_OK qRgb(198,239,206)
  11. //#define COLOR_ITEM_ERROR qRgb(255,199,206)
  12. WindowAppGvlView::WindowAppGvlView(const QString& strTitle, GVL_MODE gvlType, DllTool* pHdwTool, QWidget *parent)
  13. : QWidget(parent)
  14. , m_strTitle(strTitle)
  15. , m_gvlType(gvlType)
  16. , m_pHdwTool(pHdwTool)
  17. {
  18. ui.setupUi(this);
  19. // 初始化工具栏
  20. this->initToolbar();
  21. // 初始化变量表格
  22. ui.tableVariable->initTable(m_strTitle, m_gvlType);
  23. // UI元素初始化
  24. this->initUI();
  25. // 2022-3-2增加,创建变量表格的同时就顺便创建对应的全局变量组(空)
  26. g_pGvlManager->addNewGroup(m_strTitle, TOOL_TYPE::TOOL_TYPE_GLOBAL_VARIABLE, gvlType);
  27. #ifdef DEBUG_ON_GVL
  28. VARIABLE* pNewVariable = new VARIABLE(
  29. m_strTitle,
  30. true,
  31. "abcd", "QString", "xxxxx", "Comment1"
  32. );
  33. this->addNewVariable(pNewVariable);
  34. pNewVariable = new VARIABLE(
  35. m_strTitle,
  36. true, "int_test1", "int", "100", "Comment2"
  37. );
  38. this->addNewVariable(pNewVariable);
  39. pNewVariable = new VARIABLE(
  40. m_strTitle,
  41. true, "int_test2", "int", "200", "This value is 200."
  42. );
  43. this->addNewVariable(pNewVariable);
  44. pNewVariable = new VARIABLE(
  45. m_strTitle,
  46. true, "abcdfg", "bool", "true", "Comment3"
  47. );
  48. this->addNewVariable(pNewVariable);
  49. pNewVariable = new VARIABLE(
  50. m_strTitle,
  51. true, "double_test", "double", "765.4321", "This is a double variable"
  52. );
  53. this->addNewVariable(pNewVariable);
  54. //// 2022-2-15 尝试增加Pou内部变量(测试)
  55. //pNewVariable = new VARIABLE(
  56. // m_strTitle,
  57. // false,
  58. // "counter1",
  59. // "int", "1", "This is a internal variable", false
  60. //);
  61. //this->addNewVariable(pNewVariable);
  62. //pNewVariable = new VARIABLE(
  63. // m_strTitle,
  64. // false,
  65. // "counter2",
  66. // "int", "100", "This is a internal variable", false
  67. //);
  68. //this->addNewVariable(pNewVariable);
  69. #endif
  70. }
  71. WindowAppGvlView::~WindowAppGvlView()
  72. {
  73. }
  74. /// <summary>
  75. /// 在界面中添加新的变量(from序列化文件)
  76. /// </summary>
  77. /// <param name="pNewVariable"></param>
  78. void WindowAppGvlView::addNewVariable(VARIABLE* pNewVariable)
  79. {
  80. // 2022-2-15增加,内部变量不需要显示在界面中
  81. if (pNewVariable->bShow)
  82. {
  83. if (m_gvlType == GVL_MODE::GVL_BASIC ||
  84. m_gvlType == GVL_MODE::GVL_STANDARD)
  85. {
  86. // 界面中添加新的一行
  87. ui.tableVariable->insertTableLine(
  88. pNewVariable->bSerialized,
  89. pNewVariable->strName,
  90. pNewVariable->strFullName,
  91. Utility::getTypeString(pNewVariable->value.type),
  92. Utility::getValueString(pNewVariable->value.Ptr, pNewVariable->value.type),
  93. pNewVariable->strComment
  94. );
  95. }
  96. else
  97. {
  98. // 2022-3-2 ,如果是DB变量,首先要进行有效性检查,需要确保之前绑定了硬件工具指针
  99. Q_ASSERT(pNewVariable->parent() != nullptr);
  100. // Q_ASSERT(pNewVariable->pOriginalTool != nullptr);
  101. // Q_ASSERT(pNewVariable->pOriginalTool->pHdwDllPtr != nullptr);
  102. //if (m_gvlType == GVL_MODE::GVL_DB
  103. // && pNewVariable->pOriginalTool->pHdwDllPtr == nullptr)
  104. //{
  105. // qDebug() << "[Error] WindowAppGvlView::addNewVariable - Insert new DB variable, but pHdwDllPtr is nullptr.";
  106. // return;
  107. //}
  108. // DB变量需要添加更多的信息
  109. // 界面中添加新的一行
  110. ui.tableVariable->insertTableLine(
  111. pNewVariable->strName,
  112. pNewVariable->strFullName,
  113. Utility::getTypeString(pNewVariable->value.type),
  114. Utility::getValueString(pNewVariable->value.Ptr, pNewVariable->value.type),
  115. pNewVariable->strCommAddress,
  116. pNewVariable->accessMode,
  117. pNewVariable->strComment
  118. );
  119. }
  120. // 绑定新的变量和界面对应关系,方便变更之后及时发送通知
  121. g_pGvlManager->bindUIAndVariable(ui.tableVariable, pNewVariable->strFullName);
  122. }
  123. }
  124. /// <summary>
  125. ///
  126. /// </summary>
  127. /// <param name="event"></param>
  128. void WindowAppGvlView::showEvent(QShowEvent* event)
  129. {
  130. Q_UNUSED(event);
  131. QString str = "绑定对象: ";
  132. if (m_gvlType == GVL_MODE::GVL_DB)
  133. {
  134. POU* pHdwPou = g_pPouManager->getHdwPou();
  135. TOOL* pTool = pHdwPou->GetToolByName(m_strHdwInstName);
  136. if (pTool == nullptr)
  137. {
  138. qWarning() << m_strHdwInstName << " not found in hardware configuration ";
  139. }
  140. if (pTool != nullptr)
  141. {
  142. ui.label->setText(str + m_strHdwInstName);
  143. ui.label->setStyleSheet("background-color:rgb(70,70,70);");
  144. }
  145. else
  146. {
  147. ui.label->setStyleSheet("background-color:red;");
  148. ui.label->setText(str + " not found in hardware configuration ");
  149. }
  150. }
  151. else
  152. {
  153. ui.label->setText(str + "系统");
  154. ui.label->setStyleSheet("QLabel{background-color:rgb(70,70,70);}");
  155. }
  156. }
  157. /// <summary>
  158. /// UI元素初始化
  159. /// </summary>
  160. void WindowAppGvlView::initUI()
  161. {
  162. // 放进Layout中
  163. QVBoxLayout* viewLayout = new QVBoxLayout();
  164. viewLayout->addWidget(m_Toolbar);
  165. viewLayout->addWidget(ui.tableVariable);
  166. viewLayout->addWidget(ui.label);
  167. viewLayout->setContentsMargins(0, 0, 0, 24);
  168. viewLayout->setSpacing(0);
  169. this->setLayout(viewLayout);
  170. // ui.tableVariable->setShowGrid(false);
  171. // ui.tableVariable->setStyleSheet(
  172. // "QTableWidget::Item{border:0px solid rgb(255,0,0);"
  173. // "border-bottom:1px solid rgb(255,0,0);}"
  174. // );
  175. if (m_gvlType == GVL_MODE::GVL_DB)
  176. {
  177. if (m_pHdwTool != nullptr)
  178. {
  179. m_strHdwInstName = m_pHdwTool->getInstanceName();
  180. }
  181. }
  182. }
  183. /// <summary>
  184. /// 初始化工具栏
  185. /// </summary>
  186. void WindowAppGvlView::initToolbar()
  187. {
  188. m_Toolbar = new QToolBar(this);
  189. m_Toolbar->setToolButtonStyle(Qt::ToolButtonIconOnly);
  190. QAction* actionNew = new QAction(QIcon(":/image/New.png"), ("New"));
  191. QAction* actionMoveUp = new QAction(QIcon(":/image/Up.png"), ("Move up"));
  192. QAction* actionMoveDown = new QAction(QIcon(":/image/Down.png"), ("Move down"));
  193. QAction* actionDel = new QAction(QIcon(":/image/Del.png"), ("Delete"));
  194. QAction* actionOption = new QAction(QIcon(":/image/Option.png"), ("Options"));
  195. m_Toolbar->addAction(actionNew);
  196. m_Toolbar->addSeparator();
  197. m_Toolbar->addAction(actionMoveUp);
  198. m_Toolbar->addAction(actionMoveDown);
  199. m_Toolbar->addSeparator();
  200. m_Toolbar->addAction(actionDel);
  201. if (m_gvlType == GVL_MODE::GVL_DB)
  202. {
  203. m_Toolbar->addSeparator();
  204. m_Toolbar->addAction(actionOption);
  205. }
  206. // 增加工具栏的消息响应
  207. connect(actionNew, &QAction::triggered, this, &WindowAppGvlView::onTagNew);
  208. connect(actionMoveUp, &QAction::triggered, this, &WindowAppGvlView::onTagMoveUp);
  209. connect(actionMoveDown, &QAction::triggered, this, &WindowAppGvlView::onTagMoveDown);
  210. connect(actionDel, &QAction::triggered, this, &WindowAppGvlView::onTagDelete);
  211. connect(actionOption, &QAction::triggered, this, &WindowAppGvlView::onOption);
  212. // 设置为白色背景色
  213. //m_Toolbar->setStyleSheet("background-color:rgb(255,255,255)");
  214. m_Toolbar->setIconSize(QSize(14, 14));
  215. }
  216. /// <summary>
  217. /// Toolbar - New
  218. /// </summary>
  219. void WindowAppGvlView::onTagNew()
  220. {
  221. // 添加基础和标准模式变量
  222. if (m_gvlType != GVL_MODE::GVL_DB)
  223. {
  224. onToolNewStandard();
  225. }
  226. // 添加DB模式变量
  227. else
  228. {
  229. onToolNewDB();
  230. }
  231. }
  232. /// <summary>
  233. /// 添加基础和标准模式变量
  234. /// </summary>
  235. void WindowAppGvlView::onToolNewStandard()
  236. {
  237. // 弹出新增变量对话框
  238. DialogNewVariable dlgNewVar(m_gvlType, this);
  239. dlgNewVar.setWindowModality(Qt::WindowModal);
  240. dlgNewVar.setGroup(this->m_strTitle);
  241. dlgNewVar.setTagNumber(ui.tableVariable->rowCount());
  242. int res = dlgNewVar.exec();
  243. if (res != QDialog::Accepted)
  244. {
  245. return;
  246. }
  247. // 根据用户输入构造新的变量
  248. VARIABLE* pNewVariable = new VARIABLE(
  249. m_strTitle,
  250. dlgNewVar.m_bSerialized,
  251. dlgNewVar.m_strName,
  252. dlgNewVar.m_strType,
  253. dlgNewVar.m_strValue,
  254. dlgNewVar.m_strComment,
  255. g_pGvlManager->getVariablesCountByGroup(m_strTitle),
  256. true
  257. );
  258. // 数据结构中添加本变量信息
  259. g_pGvlManager->addNewVariable( m_strTitle, pNewVariable );
  260. // 在界面中添加新变量
  261. this->addNewVariable(pNewVariable);
  262. }
  263. /// <summary>
  264. /// 添加DB模式变量
  265. /// </summary>
  266. void WindowAppGvlView::onToolNewDB()
  267. {
  268. DialogNewDBVariable dlgNewDb(this);
  269. dlgNewDb.setGroup(this->m_strTitle);
  270. dlgNewDb.setTagNumber(ui.tableVariable->rowCount());
  271. int res = dlgNewDb.exec();
  272. if (res != QDialog::Accepted)
  273. {
  274. return;
  275. }
  276. // 计算这个新变量的索引序号
  277. int nIndex = g_pGvlManager->getVariablesCountByGroup(m_strTitle);
  278. // 根据用户输入构造新的变量(构造DB变量会多三个参数)
  279. VARIABLE* pNewVariable = new VARIABLE(
  280. m_strTitle,
  281. false,
  282. dlgNewDb.m_strName,
  283. dlgNewDb.m_strType,
  284. dlgNewDb.m_strValue,
  285. dlgNewDb.m_strComment,
  286. nIndex,
  287. true,
  288. dlgNewDb.m_bTrigger,
  289. dlgNewDb.m_strCommAddress,
  290. dlgNewDb.m_accessMode
  291. );
  292. // 数据结构中添加本变量信息
  293. g_pGvlManager->addNewVariable(m_strTitle, pNewVariable);
  294. // 在界面中添加新变量
  295. this->addNewVariable(pNewVariable);
  296. }
  297. /// <summary>
  298. /// Toolbar - MoveUp
  299. /// </summary>
  300. void WindowAppGvlView::onTagMoveUp()
  301. {
  302. // qDebug() << "WindowAppGvlView::onToolMoveUp";
  303. ui.tableVariable->onVariableMoveUp();
  304. }
  305. /// <summary>
  306. /// Toolbar - MoveDown
  307. /// </summary>
  308. void WindowAppGvlView::onTagMoveDown()
  309. {
  310. // qDebug() << "WindowAppGvlView::onToolMoveDown";
  311. ui.tableVariable->onVariableMoveDown();
  312. }
  313. /// <summary>
  314. /// Toolbar - Delete
  315. /// </summary>
  316. void WindowAppGvlView::onTagDelete()
  317. {
  318. ui.tableVariable->onVariableDelete();
  319. }
  320. /// <summary>
  321. /// Toolbar - Option
  322. /// </summary>
  323. void WindowAppGvlView::onOption()
  324. {
  325. vDebug() << "WindowAppGvlView::onOption()";
  326. //DialogDBOption dlgDbOption(this);
  327. //int res = dlgDbOption.exec();
  328. //Q_UNUSED(res);
  329. }