DataStream/datatypeconfigration.cpp

86 lines
2.9 KiB
C++

#include "datatypeconfigration.h"
#include <QSplitter>
#include <QVBoxLayout>
DataConfigration::DataConfigration(MapCore &core, std::shared_ptr<const DownAccess> target, QWidget *parent)
: QWidget(parent),
core_bind(core),
target_bind(target),
member_present(new QTableView(this)),
member_model(new QStandardItemModel(this)),
preview_present(new QTreeView(this)),
preview_model(new QStandardItemModel(this)),
append(new QPushButton("添加", this)),
remove(new QPushButton("删除", this)) {
auto layout = new QVBoxLayout(this);
auto splitter = new QSplitter(this);
layout->addWidget(splitter);
auto widget = new QWidget(this);
splitter->addWidget(widget);
splitter->addWidget(preview_present);
auto xlayout = new QVBoxLayout(widget);
xlayout->addWidget(member_present);
xlayout->addWidget(append);
xlayout->addWidget(remove);
member_present->setModel(member_model);
preview_present->setModel(preview_model);
xlayout->setMargin(2);
layout->setMargin(2);
xlayout->setSpacing(2);
layout->setSpacing(2);
this->member_model->setHorizontalHeaderLabels(QStringList() << "成员名称" << "成员类型");
this->preview_model->setHorizontalHeaderLabels(QStringList() << "成员名称" << "成员类型");
present_member(target);
present_struct(target);
connect(this->append, &QPushButton::clicked, [=](){
auto ninst = std::make_shared<DownAccess>(std::make_shared<TypeTemplate>());
auto target_x = target_bind->append(ninst);
this->core_bind.refreshRoot(target_bind, target_x);
this->target_bind = target_x;
this->member_model->removeRows(0, member_model->rowCount());
this->preview_model->removeRows(0, preview_model->rowCount());
present_member(target_bind);
present_struct(target_bind);
});
}
void DataConfigration::present_member(std::shared_ptr<const DownAccess> base)
{
auto list = base->members();
for(auto &d : list){
QList<QStandardItem*> row;
row << new QStandardItem(d->typePeer<TypeTemplate>()->name());
row << new QStandardItem(d->typePeer<TypeTemplate>()->type());
this->member_model->appendRow(row);
}
}
void DataConfigration::present_struct(std::shared_ptr<const DownAccess> base, QStandardItem *target)
{
auto list = base->members();
for(auto &d : list){
QList<QStandardItem*> row;
row << new QStandardItem(d->typePeer<TypeTemplate>()->name());
row << new QStandardItem(d->typePeer<TypeTemplate>()->type());
if(!target)
this->preview_model->appendRow(row);
else
target->appendRow(row);
row.first()->setEditable(false);
row.last()->setEditable(false);
present_struct(d, row.first());
}
}