From 8b794417baa52b5ac0986203888650229123eb0d Mon Sep 17 00:00:00 2001
From: taynpg <taynpg@163.com>
Date: Wed, 15 May 2024 13:17:24 +0800
Subject: [PATCH] =?UTF-8?q?rel=EF=BC=9A=E7=AC=AC=E4=B8=80=E4=B8=AA?=
 =?UTF-8?q?=E5=88=9D=E6=AD=A5=E5=8F=AF=E7=94=A8=E7=89=88=E6=9C=AC=E3=80=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 MainWidget.cpp  | 69 ++++++++++++++++++++++++++++++++++++++++++-------
 MainWidget.h    |  5 ++++
 src/xml_opr.cpp | 10 +++++++
 src/xml_opr.h   |  2 ++
 4 files changed, 76 insertions(+), 10 deletions(-)

diff --git a/MainWidget.cpp b/MainWidget.cpp
index caf5fa6..4f3166d 100644
--- a/MainWidget.cpp
+++ b/MainWidget.cpp
@@ -5,7 +5,7 @@ MainWidget::MainWidget(QWidget* parent) : QWidget(parent), ui(new Ui::MainWidget
 {
     ui->setupUi(this);
 
-    setWindowTitle(u8"OneLevelXmlOpr v0.9");
+    setWindowTitle(u8"OneLevelXmlOpr v1.0.0");
     setWindowIcon(QIcon("://resource/xml.ico"));
 
     width_.push_back(280);
@@ -13,8 +13,12 @@ MainWidget::MainWidget(QWidget* parent) : QWidget(parent), ui(new Ui::MainWidget
         width_.push_back(160);
     }
 
+    ui->edStatus->setEnabled(false);
+    ui->btnSave->setEnabled(false);
+
     connect(ui->btnRead, &QPushButton::clicked, this, [&]() { read(); });
     connect(ui->btnSearch, &QPushButton::clicked, this, [&]() { search(); });
+    connect(ui->btnSave, &QPushButton::clicked, this, [&]() { save(); });
 }
 
 MainWidget::~MainWidget()
@@ -31,6 +35,8 @@ void MainWidget::set_work_exe(char* path)
 void MainWidget::generate_table_widget()
 {
     tab_widget_ = new QTableWidget();
+    connect(tab_widget_, &QTableWidget::itemChanged, this, [&](QTableWidgetItem* item) { item_changed_handle(item); });
+
     auto config = ini_.get_config();
     auto keys = splitString(config.purpose, ",");
     keys_.clear();
@@ -67,7 +73,7 @@ void MainWidget::push_content(const std::vector<tinyxml2::XMLElement*>& eles)
             QTableWidgetItem* wgItem = new QTableWidgetItem();
 
             if (i == 0) {
-                wgItem->setFlags(wgItem->flags() & ~Qt::ItemIsEditable); 
+                wgItem->setFlags(wgItem->flags() & ~Qt::ItemIsEditable);
             }
 
             wgItem->setText(QString(data));
@@ -83,19 +89,26 @@ void MainWidget::read()
     }
     OprBase base = ini_.get_config();
     if (!xml_.open(base.xml_path)) {
-        QString status = u8"Open【" + QString::fromStdString(base.xml_path.c_str()) + u8"】Failed."; 
+        QString status = u8"Open【" + QString::fromStdString(base.xml_path.c_str()) + u8"】Failed.";
         return;
     }
     xml_.set_baseinfo(base);
     if (!xml_.parse_xml(vec_)) {
-        QString status = u8"parse_xml【" + QString::fromStdString(base.xml_path.c_str()) + u8"】Failed."; 
+        QString status = u8"parse_xml【" + QString::fromStdString(base.xml_path.c_str()) + u8"】Failed.";
         return;
     }
+
+    auto_add_ = true;
     generate_table_widget();
     push_content(vec_);
+    current_ = vec_;
+    auto_add_ = false;
 
-    QString status = u8"Open And Parse【" + QString::fromLocal8Bit(base.xml_path.c_str()) + u8"】Success."; 
+    QString status = u8"Open And Parse【" + QString::fromLocal8Bit(base.xml_path.c_str()) + u8"】Success.";
     ui->edStatus->setText(status);
+
+    ui->btnRead->setEnabled(false);
+    ui->btnSave->setEnabled(true);
 }
 
 void MainWidget::search()
@@ -104,17 +117,53 @@ void MainWidget::search()
     if (key.isEmpty()) {
         return;
     }
-    std::vector<tinyxml2::XMLElement*> result{};
+    if (tab_widget_ == nullptr) {
+        return;
+    }
+    current_.clear();
     for (const auto& item : vec_) {
         for (auto i = 0; i < keys_.size(); ++i) {
-            const char*       data = item->Attribute(keys_[i].c_str());
-            QString qdata(data);
+            const char* data = item->Attribute(keys_[i].c_str());
+            QString     qdata(data);
             if (!qdata.contains(key)) {
                 continue;
             }
-            result.push_back(item);
+            current_.push_back(item);
             break;
         }
     }
-    push_content(result);
+    push_content(current_);
+}
+
+void MainWidget::item_changed_handle(QTableWidgetItem* item)
+{
+    if (auto_add_) {
+        return;
+    }
+    if (item == nullptr) {
+        return;
+    }
+    int row = item->row();
+    int col = item->column();
+
+    QString xml_key = tab_widget_->item(row, 0)->text();
+    for (const auto& ele : current_) {
+        const char* data = ele->Attribute(keys_[0].c_str());
+        QString     qdata(data);
+        if (qdata != xml_key) {
+            continue;
+        }
+        ele->SetAttribute(keys_[col].c_str(), item->text().toLocal8Bit().constData());
+        break;
+    }
+}
+
+void MainWidget::save()
+{
+    if (xml_.save()) {
+        QMessageBox::information(this, u8"提示", u8"保存成功");
+    }
+    else {
+        QMessageBox::information(this, u8"提示", u8"保存失败");
+    }
 }
diff --git a/MainWidget.h b/MainWidget.h
index 8e25ea3..39d99da 100644
--- a/MainWidget.h
+++ b/MainWidget.h
@@ -3,6 +3,7 @@
 
 #include <QWidget>
 #include <QTableWidget>
+#include <QMessageBox>
 #include "src/xml_opr.h"
 #include "src/config.h"
 
@@ -28,6 +29,8 @@ public:
 private:
     void read();
     void search();
+    void item_changed_handle(QTableWidgetItem *item);
+    void save();
 private:
     Ui::MainWidget*                    ui;
     ConfigIni                          ini_{};
@@ -35,7 +38,9 @@ private:
     std::string                        exe_path_{};
     QTableWidget*                      tab_widget_{};
     std::vector<tinyxml2::XMLElement*> vec_{};
+    std::vector<tinyxml2::XMLElement*> current_{};
     std::vector<std::string>           keys_{};
     std::vector<int>                   width_{};
+    bool                               auto_add_{false};
 };
 #endif   // MAINWIDGET_H
diff --git a/src/xml_opr.cpp b/src/xml_opr.cpp
index 3f31456..18bf458 100644
--- a/src/xml_opr.cpp
+++ b/src/xml_opr.cpp
@@ -8,6 +8,7 @@ bool CXmlOpr::open(const std::string &xml_path)
     if (doc_.LoadFile(xml_path.c_str()) != tinyxml2::XML_SUCCESS) {
         return false;
     }
+    xml_path_ = xml_path;
     return true;
 }
 
@@ -45,3 +46,12 @@ bool CXmlOpr::parse_xml(std::vector<tinyxml2::XMLElement*>& vec)
     }
     return true;
 }
+
+bool CXmlOpr::save()
+{
+    auto ret = doc_.SaveFile(xml_path_.c_str());
+    if (ret != tinyxml2::XML_SUCCESS) {
+        return false;
+    }
+    return true;
+}
diff --git a/src/xml_opr.h b/src/xml_opr.h
index 03232a2..c7a65c6 100644
--- a/src/xml_opr.h
+++ b/src/xml_opr.h
@@ -16,10 +16,12 @@ public:
     bool open(const std::string& xml_path);
     void set_baseinfo(const OprBase& base);
     bool parse_xml(std::vector<tinyxml2::XMLElement*>& vec);
+    bool save();
 
 private:
     tinyxml2::XMLDocument doc_{};
     OprBase               opr_base_{};
+    std::string           xml_path_{};
 };
 
 #endif
\ No newline at end of file