json_edit_dialog.cpp 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #include "json_edit_dialog.h"
  2. #include <QJsonDocument>
  3. #include <QLabel>
  4. #include <QMessageBox>
  5. #include <QVBoxLayout>
  6. namespace MapEditor {
  7. JsonEditDialog::JsonEditDialog(const QString &title, const QJsonObject &json,
  8. QWidget *parent)
  9. : QDialog(parent) {
  10. setupUI(title, json);
  11. }
  12. void JsonEditDialog::setupUI(const QString &title, const QJsonObject &json) {
  13. setWindowTitle(title);
  14. resize(500, 400);
  15. auto *layout = new QVBoxLayout(this);
  16. auto *label =
  17. new QLabel("Edit JSON properties (changes will be saved to map):", this);
  18. layout->addWidget(label);
  19. m_editor = new QPlainTextEdit(this);
  20. m_editor->setFont(QFont("Monospace", 10));
  21. QJsonDocument doc(json);
  22. m_editor->setPlainText(doc.toJson(QJsonDocument::Indented));
  23. layout->addWidget(m_editor);
  24. connect(m_editor, &QPlainTextEdit::textChanged, this,
  25. &JsonEditDialog::validateJson);
  26. auto *buttonLayout = new QHBoxLayout();
  27. auto *cancelButton = new QPushButton("Cancel", this);
  28. m_okButton = new QPushButton("OK", this);
  29. m_okButton->setDefault(true);
  30. buttonLayout->addStretch();
  31. buttonLayout->addWidget(cancelButton);
  32. buttonLayout->addWidget(m_okButton);
  33. layout->addLayout(buttonLayout);
  34. connect(cancelButton, &QPushButton::clicked, this, &QDialog::reject);
  35. connect(m_okButton, &QPushButton::clicked, this, &JsonEditDialog::onAccepted);
  36. validateJson();
  37. }
  38. void JsonEditDialog::validateJson() {
  39. QJsonParseError error;
  40. QJsonDocument doc =
  41. QJsonDocument::fromJson(m_editor->toPlainText().toUtf8(), &error);
  42. m_isValid = (error.error == QJsonParseError::NoError && doc.isObject());
  43. m_okButton->setEnabled(m_isValid);
  44. if (!m_isValid) {
  45. m_editor->setStyleSheet("QPlainTextEdit { border: 2px solid red; }");
  46. } else {
  47. m_editor->setStyleSheet("");
  48. }
  49. }
  50. void JsonEditDialog::onAccepted() {
  51. QJsonParseError error;
  52. QJsonDocument doc =
  53. QJsonDocument::fromJson(m_editor->toPlainText().toUtf8(), &error);
  54. if (error.error == QJsonParseError::NoError && doc.isObject()) {
  55. m_result = doc.object();
  56. m_isValid = true;
  57. accept();
  58. } else {
  59. QMessageBox::warning(this, "Invalid JSON",
  60. "The JSON is not valid: " + error.errorString());
  61. }
  62. }
  63. QJsonObject JsonEditDialog::getJson() const { return m_result; }
  64. } // namespace MapEditor