综合平台编程器项目的远程存储
Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
 
 
 
 

246 righe
7.9 KiB

  1. #include "alarm_configuration_dialog.h"
  2. #include "services/alarm_editor_service.h"
  3. #include "ui_alarm_configuration_dialog.h"
  4. #include <QHeaderView>
  5. #include <QMessageBox>
  6. #include <QTableWidgetItem>
  7. namespace {
  8. QString fromUtf8(const std::string &value)
  9. {
  10. return QString::fromUtf8(value.data(), static_cast<int>(value.size()));
  11. }
  12. std::string toUtf8(const QString &value)
  13. {
  14. const QByteArray bytes = value.toUtf8();
  15. return std::string(bytes.constData(), static_cast<std::size_t>(bytes.size()));
  16. }
  17. QString conditionText(AlarmCondition condition)
  18. {
  19. switch (condition)
  20. {
  21. case AlarmCondition::MOn:
  22. {
  23. return AlarmConfigurationDialog::tr("M 为 ON");
  24. }
  25. case AlarmCondition::DHigh:
  26. {
  27. return AlarmConfigurationDialog::tr("D 大于等于阈值");
  28. }
  29. case AlarmCondition::DLow:
  30. {
  31. return AlarmConfigurationDialog::tr("D 小于等于阈值");
  32. }
  33. default:
  34. {
  35. return {};
  36. }
  37. }
  38. }
  39. } // namespace
  40. AlarmConfigurationDialog::AlarmConfigurationDialog(
  41. AlarmEditorService &service,
  42. QWidget *parent)
  43. : QDialog(parent),
  44. ui_(std::make_unique<Ui::AlarmConfigurationDialog>()),
  45. service_(service)
  46. {
  47. ui_->setupUi(this);
  48. ui_->alarmTable->horizontalHeader()->setSectionResizeMode(
  49. 0, QHeaderView::ResizeToContents);
  50. ui_->alarmTable->horizontalHeader()->setSectionResizeMode(
  51. 1, QHeaderView::ResizeToContents);
  52. ui_->alarmTable->horizontalHeader()->setSectionResizeMode(
  53. 2, QHeaderView::ResizeToContents);
  54. ui_->alarmTable->horizontalHeader()->setSectionResizeMode(
  55. 3, QHeaderView::ResizeToContents);
  56. ui_->alarmTable->horizontalHeader()->setSectionResizeMode(
  57. 4, QHeaderView::Stretch);
  58. ui_->areaComboBox->setItemData(0, static_cast<int>(RegisterArea::M));
  59. ui_->areaComboBox->setItemData(1, static_cast<int>(RegisterArea::D));
  60. connect(ui_->areaComboBox,
  61. QOverload<int>::of(&QComboBox::currentIndexChanged),
  62. this,
  63. [this] { updateConditionOptions(); });
  64. connect(ui_->alarmTable, &QTableWidget::itemSelectionChanged,
  65. this, [this] { loadSelectedDefinition(); });
  66. connect(ui_->addButton, &QPushButton::clicked,
  67. this, [this] { addDefinition(); });
  68. connect(ui_->updateButton, &QPushButton::clicked,
  69. this, [this] { updateDefinition(); });
  70. connect(ui_->removeButton, &QPushButton::clicked,
  71. this, [this] { removeDefinition(); });
  72. connect(ui_->buttonBox, &QDialogButtonBox::rejected,
  73. this, &QDialog::reject);
  74. updateConditionOptions();
  75. reloadDefinitions();
  76. }
  77. AlarmConfigurationDialog::~AlarmConfigurationDialog() = default;
  78. void AlarmConfigurationDialog::reloadDefinitions(const std::string &selected_id)
  79. {
  80. const auto &definitions = service_.definitions();
  81. ui_->alarmTable->setRowCount(static_cast<int>(definitions.size()));
  82. int selected_row = -1;
  83. for (std::size_t index = 0; index < definitions.size(); ++index)
  84. {
  85. const AlarmDefinition &definition = definitions[index];
  86. const int row = static_cast<int>(index);
  87. auto *id_item = new QTableWidgetItem(fromUtf8(definition.id));
  88. id_item->setData(Qt::UserRole, fromUtf8(definition.id));
  89. ui_->alarmTable->setItem(row, 0, id_item);
  90. ui_->alarmTable->setItem(
  91. row, 1, new QTableWidgetItem(QString::fromStdString(
  92. definition.address.toString())));
  93. ui_->alarmTable->setItem(
  94. row, 2, new QTableWidgetItem(conditionText(definition.condition)));
  95. ui_->alarmTable->setItem(
  96. row,
  97. 3,
  98. new QTableWidgetItem(
  99. definition.condition == AlarmCondition::MOn
  100. ? QStringLiteral("-")
  101. : QString::number(definition.threshold)));
  102. ui_->alarmTable->setItem(
  103. row, 4, new QTableWidgetItem(fromUtf8(definition.message)));
  104. if (definition.id == selected_id)
  105. {
  106. selected_row = row;
  107. }
  108. }
  109. if (selected_row >= 0)
  110. {
  111. ui_->alarmTable->selectRow(selected_row);
  112. }
  113. else
  114. {
  115. ui_->alarmTable->clearSelection();
  116. ui_->updateButton->setEnabled(false);
  117. ui_->removeButton->setEnabled(false);
  118. }
  119. }
  120. void AlarmConfigurationDialog::loadSelectedDefinition()
  121. {
  122. const AlarmDefinition *definition = service_.findDefinition(selectedId());
  123. const bool selected = definition != nullptr;
  124. ui_->updateButton->setEnabled(selected);
  125. ui_->removeButton->setEnabled(selected);
  126. if (!selected)
  127. {
  128. return;
  129. }
  130. ui_->areaComboBox->setCurrentIndex(
  131. definition->address.area() == RegisterArea::M ? 0 : 1);
  132. updateConditionOptions();
  133. ui_->conditionComboBox->setCurrentIndex(
  134. ui_->conditionComboBox->findData(
  135. static_cast<int>(definition->condition)));
  136. ui_->indexSpinBox->setValue(definition->address.index());
  137. ui_->thresholdSpinBox->setValue(definition->threshold);
  138. ui_->messageEdit->setText(fromUtf8(definition->message));
  139. }
  140. void AlarmConfigurationDialog::updateConditionOptions()
  141. {
  142. const RegisterArea area = static_cast<RegisterArea>(
  143. ui_->areaComboBox->currentData().toInt());
  144. ui_->conditionComboBox->clear();
  145. if (area == RegisterArea::M)
  146. {
  147. ui_->conditionComboBox->addItem(
  148. conditionText(AlarmCondition::MOn),
  149. static_cast<int>(AlarmCondition::MOn));
  150. }
  151. else
  152. {
  153. ui_->conditionComboBox->addItem(
  154. conditionText(AlarmCondition::DHigh),
  155. static_cast<int>(AlarmCondition::DHigh));
  156. ui_->conditionComboBox->addItem(
  157. conditionText(AlarmCondition::DLow),
  158. static_cast<int>(AlarmCondition::DLow));
  159. }
  160. ui_->thresholdLabel->setEnabled(area == RegisterArea::D);
  161. ui_->thresholdSpinBox->setEnabled(area == RegisterArea::D);
  162. }
  163. void AlarmConfigurationDialog::addDefinition()
  164. {
  165. const AlarmEditorResult result = service_.addDefinition(definitionFromInputs());
  166. if (!result.succeeded)
  167. {
  168. QMessageBox::warning(this, tr("新增报警"), fromUtf8(result.message));
  169. return;
  170. }
  171. reloadDefinitions(result.id);
  172. }
  173. void AlarmConfigurationDialog::updateDefinition()
  174. {
  175. const std::string id = selectedId();
  176. if (id.empty())
  177. {
  178. return;
  179. }
  180. const AlarmEditorResult result = service_.updateDefinition(
  181. id, definitionFromInputs());
  182. if (!result.succeeded)
  183. {
  184. QMessageBox::warning(this, tr("更新报警"), fromUtf8(result.message));
  185. return;
  186. }
  187. reloadDefinitions(result.id);
  188. }
  189. void AlarmConfigurationDialog::removeDefinition()
  190. {
  191. const std::string id = selectedId();
  192. if (id.empty())
  193. {
  194. return;
  195. }
  196. if (QMessageBox::question(
  197. this, tr("删除报警"), tr("确定删除当前报警定义吗?"))
  198. != QMessageBox::Yes)
  199. {
  200. return;
  201. }
  202. const AlarmEditorResult result = service_.removeDefinition(id);
  203. if (!result.succeeded)
  204. {
  205. QMessageBox::warning(this, tr("删除报警"), fromUtf8(result.message));
  206. return;
  207. }
  208. reloadDefinitions();
  209. }
  210. AlarmDefinition AlarmConfigurationDialog::definitionFromInputs() const
  211. {
  212. AlarmDefinition definition;
  213. const RegisterArea area = static_cast<RegisterArea>(
  214. ui_->areaComboBox->currentData().toInt());
  215. definition.address = RegisterAddress{area, ui_->indexSpinBox->value()};
  216. definition.condition = static_cast<AlarmCondition>(
  217. ui_->conditionComboBox->currentData().toInt());
  218. definition.threshold = static_cast<std::int16_t>(
  219. ui_->thresholdSpinBox->value());
  220. definition.message = toUtf8(ui_->messageEdit->text().trimmed());
  221. return definition;
  222. }
  223. std::string AlarmConfigurationDialog::selectedId() const
  224. {
  225. const int row = ui_->alarmTable->currentRow();
  226. const QTableWidgetItem *item = row >= 0 ? ui_->alarmTable->item(row, 0) : nullptr;
  227. return item == nullptr ? std::string{} : toUtf8(item->data(Qt::UserRole).toString());
  228. }