#include "MainWidget.h" #include "./ui_MainWidget.h" MainWidget::MainWidget(QWidget* parent) : QWidget(parent), ui(new Ui::MainWidget) { ui->setupUi(this); setWindowTitle(u8"OneLevelXmlOpr v1.0.0"); setWindowIcon(QIcon("://resource/xml.ico")); width_.push_back(280); for (int i = 0; i < 30; ++i) { width_.push_back(160); } ui->edStatus->setEnabled(false); ui->btnSave->setEnabled(false); ui->btnCopySelectLine->setEnabled(false); ui->btnDelSelectLine->setEnabled(false); connect(ui->btnRead, &QPushButton::clicked, this, [&]() { read(); }); connect(ui->btnSearch, &QPushButton::clicked, this, [&]() { search(); }); connect(ui->btnSave, &QPushButton::clicked, this, [&]() { save(); }); connect(ui->btnCopySelectLine, &QPushButton::clicked, this, [&]() { copy_select_line(); }); connect(ui->btnDelSelectLine, &QPushButton::clicked, this, [&]() { del_select_line(); }); } MainWidget::~MainWidget() { delete ui; } void MainWidget::set_work_exe(char* path) { exe_path_.clear(); exe_path_.append(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(); QStringList list; for (const auto& item : keys) { if (item.empty()) { continue; } keys_.push_back(item); list.append(QString::fromStdString(item)); } tab_widget_->setColumnCount(list.size()); tab_widget_->setHorizontalHeaderLabels(list); tab_widget_->setSelectionBehavior(QAbstractItemView::SelectRows); tab_widget_->setSelectionMode(QAbstractItemView::SelectionMode::SingleSelection); for (auto i = 0; i < keys.size(); ++i) { tab_widget_->setColumnWidth(i, width_[i]); } QHBoxLayout* lay = new QHBoxLayout(); lay->addWidget(tab_widget_); ui->widget->setLayout(lay); } void MainWidget::push_content(const std::vector& eles) { tab_widget_->clearContents(); tab_widget_->setRowCount(0); for (const auto& ele : eles) { int row_cnt = tab_widget_->rowCount(); tab_widget_->insertRow(row_cnt); for (auto i = 0; i < keys_.size(); ++i) { const char* data = ele->Attribute(keys_[i].c_str()); QTableWidgetItem* wgItem = new QTableWidgetItem(); if (i == 0) { wgItem->setFlags(wgItem->flags() & ~Qt::ItemIsEditable); } wgItem->setText(QString(data)); tab_widget_->setItem(row_cnt, i, wgItem); } } } void MainWidget::read() { if (!ini_.set_work_exe(exe_path_)) { return; } OprBase base = ini_.get_config(); if (!xml_.open(base.xml_path)) { 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."; 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."; ui->edStatus->setText(status); ui->btnRead->setEnabled(false); ui->btnSave->setEnabled(true); ui->btnCopySelectLine->setEnabled(true); ui->btnDelSelectLine->setEnabled(true); } void MainWidget::search() { QString key = ui->edSearchKey->text().trimmed(); if (key.isEmpty()) { return; } 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); if (!qdata.contains(key)) { continue; } current_.push_back(item); break; } } 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(); element* result = get_element_bykey(xml_key); if (result == nullptr) { return; } result->SetAttribute(keys_[col].c_str(), item->text().toLocal8Bit().constData()); } void MainWidget::save() { if (xml_.save()) { CUtil::msg(this, u8"保存成功"); } else { CUtil::msg(this, u8"保存失败"); } } void MainWidget::copy_select_line() { element* target = get_current_select_key(); if (target == nullptr) { return; } element* newer = xml_.copy_element(target); xml_.insert_brother_node(target, newer); // TODO: 添加到界面 CUtil::msg(this, u8"已复制"); } void MainWidget::del_select_line() { element* target = get_current_select_key(); if (target == nullptr) { return; } } element* MainWidget::get_current_select_key() { element* ret = nullptr; if (tab_widget_ == nullptr) { return ret; } QList selectedItems = tab_widget_->selectedItems(); if (selectedItems.size() < 1) { CUtil::msg(this, u8"没有选中数据"); return ret; } QTableWidgetItem* item = selectedItems[0]; int row = item->row(); ret = get_element_bykey(item->text()); return ret; } tinyxml2::XMLElement* MainWidget::get_element_bykey(const QString& key) { element* ret = nullptr; for (const auto& ele : current_) { const char* data = ele->Attribute(keys_[0].c_str()); QString qdata(data); if (qdata != key) { continue; } ret = ele; break; } return ret; }