113 lines
4.4 KiB
C++
113 lines
4.4 KiB
C++
#include "ExportDatasetDialog.hpp"
|
||
|
||
#include <utility>
|
||
|
||
#include <QComboBox>
|
||
#include <QDialogButtonBox>
|
||
#include <QFormLayout>
|
||
#include <QJsonArray>
|
||
#include <QJsonDocument>
|
||
#include <QJsonObject>
|
||
#include <QLabel>
|
||
#include <QMessageBox>
|
||
#include <QPushButton>
|
||
|
||
#include "FormKit.hpp"
|
||
#include "Theme.hpp"
|
||
#include "api/NavLoads.hpp"
|
||
#include "api/NavRequest.hpp"
|
||
#include "repo/IAsyncProjectRepository.hpp"
|
||
|
||
namespace geopro::app {
|
||
|
||
ExportDatasetDialog::ExportDatasetDialog(geopro::data::IAsyncProjectRepository& repo,
|
||
QString dsObjectId, QString tmTypeBaseConfId,
|
||
QWidget* parent)
|
||
: QDialog(parent), repo_(repo), dsObjectId_(std::move(dsObjectId)),
|
||
tmTypeBaseConfId_(std::move(tmTypeBaseConfId)) {
|
||
setModal(true);
|
||
setWindowTitle(QStringLiteral("导出数据集"));
|
||
setMinimumWidth(geopro::app::scaledPx(400));
|
||
|
||
auto* root = formkit::dialogRoot(this);
|
||
|
||
auto* card = formkit::formCard(this);
|
||
auto* cardLay = formkit::cardBody(card);
|
||
|
||
auto* fl = formkit::makeEditForm();
|
||
// 空态感知下拉:数据驱动(异步 loadTemplates),未选显占位、无数据弹「暂无数据」。
|
||
templateCombo_ = formkit::comboBox(QStringLiteral("请选择导出模板"), this);
|
||
formkit::capField(templateCombo_);
|
||
fl->addRow(formkit::editLabel(QStringLiteral("导出模板")), templateCombo_);
|
||
cardLay->addLayout(fl);
|
||
|
||
status_ = new QLabel(QStringLiteral("加载模板…"), this);
|
||
geopro::app::applyTokenizedStyleSheet(status_, QStringLiteral("color:{{text/disabled}};"));
|
||
cardLay->addWidget(status_);
|
||
|
||
root->addWidget(card);
|
||
|
||
auto* buttons =
|
||
formkit::addDialogButtons(root, this, QStringLiteral("导出"), QStringLiteral("取消"));
|
||
// Ok 不直接 accept:需先 onConfirm 校验/异步导出,成功后才 accept。断开默认 accepted→accept。
|
||
QObject::disconnect(buttons, &QDialogButtonBox::accepted, this, &QDialog::accept);
|
||
okBtn_ = buttons->button(QDialogButtonBox::Ok);
|
||
okBtn_->setDefault(true);
|
||
okBtn_->setEnabled(false);
|
||
QObject::connect(okBtn_, &QPushButton::clicked, this, &ExportDatasetDialog::onConfirm);
|
||
|
||
loadTemplates();
|
||
}
|
||
|
||
ExportDatasetDialog::~ExportDatasetDialog() {
|
||
// 析构时取消在途请求,避免回调命中已销毁的 this。
|
||
if (tplReq_) tplReq_->abort();
|
||
if (expReq_) expReq_->abort();
|
||
}
|
||
|
||
void ExportDatasetDialog::loadTemplates() {
|
||
if (tplReq_) tplReq_->abort();
|
||
tplReq_ = repo_.queryExportTemplatesAsync(tmTypeBaseConfId_.toStdString());
|
||
QObject::connect(tplReq_, &geopro::data::NavRequest::done, this, [this](const QVariant& v) {
|
||
templates_ = qvariant_cast<std::vector<geopro::data::ExportTemplate>>(v);
|
||
if (templates_.empty()) {
|
||
status_->setText(QStringLiteral("无可用导出模板"));
|
||
return;
|
||
}
|
||
status_->setVisible(false);
|
||
for (const auto& t : templates_)
|
||
templateCombo_->addItem(QString::fromStdString(t.name), QString::fromStdString(t.id));
|
||
okBtn_->setEnabled(true);
|
||
});
|
||
QObject::connect(tplReq_, &geopro::data::NavRequest::failed, this, [this](const QString& msg) {
|
||
status_->setText(QStringLiteral("加载模板失败:%1").arg(msg));
|
||
});
|
||
}
|
||
|
||
void ExportDatasetDialog::onConfirm() {
|
||
const QString templateId = templateCombo_->currentData().toString();
|
||
if (templateId.isEmpty()) {
|
||
QMessageBox::warning(this, QStringLiteral("校验"), QStringLiteral("请选择导出模板"));
|
||
return;
|
||
}
|
||
// 模板导出 body(spec §E.2):{ dsObjectIdList:[该ds], templateId }。
|
||
QJsonObject body{{QStringLiteral("dsObjectIdList"), QJsonArray{dsObjectId_}},
|
||
{QStringLiteral("templateId"), templateId}};
|
||
|
||
okBtn_->setEnabled(false);
|
||
status_->setText(QStringLiteral("导出中…"));
|
||
status_->setVisible(true);
|
||
if (expReq_) expReq_->abort();
|
||
expReq_ = repo_.exportDatasetAsync(QJsonDocument(body).toJson(QJsonDocument::Compact).toStdString());
|
||
QObject::connect(expReq_, &geopro::data::NavRequest::done, this, [this](const QVariant&) {
|
||
emit exported();
|
||
accept();
|
||
});
|
||
QObject::connect(expReq_, &geopro::data::NavRequest::failed, this, [this](const QString& msg) {
|
||
status_->setText(QStringLiteral("导出失败:%1").arg(msg));
|
||
okBtn_->setEnabled(true);
|
||
});
|
||
}
|
||
|
||
} // namespace geopro::app
|