初始化仓库
This commit is contained in:
commit
532ce2d0ae
|
@ -0,0 +1,73 @@
|
||||||
|
# This file is used to ignore files which are generated
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
*~
|
||||||
|
*.autosave
|
||||||
|
*.a
|
||||||
|
*.core
|
||||||
|
*.moc
|
||||||
|
*.o
|
||||||
|
*.obj
|
||||||
|
*.orig
|
||||||
|
*.rej
|
||||||
|
*.so
|
||||||
|
*.so.*
|
||||||
|
*_pch.h.cpp
|
||||||
|
*_resource.rc
|
||||||
|
*.qm
|
||||||
|
.#*
|
||||||
|
*.*#
|
||||||
|
core
|
||||||
|
!core/
|
||||||
|
tags
|
||||||
|
.DS_Store
|
||||||
|
.directory
|
||||||
|
*.debug
|
||||||
|
Makefile*
|
||||||
|
*.prl
|
||||||
|
*.app
|
||||||
|
moc_*.cpp
|
||||||
|
ui_*.h
|
||||||
|
qrc_*.cpp
|
||||||
|
Thumbs.db
|
||||||
|
*.res
|
||||||
|
*.rc
|
||||||
|
/.qmake.cache
|
||||||
|
/.qmake.stash
|
||||||
|
|
||||||
|
# qtcreator generated files
|
||||||
|
*.pro.user*
|
||||||
|
|
||||||
|
# xemacs temporary files
|
||||||
|
*.flc
|
||||||
|
|
||||||
|
# Vim temporary files
|
||||||
|
.*.swp
|
||||||
|
|
||||||
|
# Visual Studio generated files
|
||||||
|
*.ib_pdb_index
|
||||||
|
*.idb
|
||||||
|
*.ilk
|
||||||
|
*.pdb
|
||||||
|
*.sln
|
||||||
|
*.suo
|
||||||
|
*.vcproj
|
||||||
|
*vcproj.*.*.user
|
||||||
|
*.ncb
|
||||||
|
*.sdf
|
||||||
|
*.opensdf
|
||||||
|
*.vcxproj
|
||||||
|
*vcxproj.*
|
||||||
|
|
||||||
|
# MinGW generated files
|
||||||
|
*.Debug
|
||||||
|
*.Release
|
||||||
|
|
||||||
|
# Python byte code
|
||||||
|
*.pyc
|
||||||
|
|
||||||
|
# Binaries
|
||||||
|
# --------
|
||||||
|
*.dll
|
||||||
|
*.exe
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
QT += core gui
|
||||||
|
|
||||||
|
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
|
||||||
|
|
||||||
|
CONFIG += c++11
|
||||||
|
|
||||||
|
# You can make your code fail to compile if it uses deprecated APIs.
|
||||||
|
# In order to do so, uncomment the following line.
|
||||||
|
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
|
||||||
|
|
||||||
|
msvc {
|
||||||
|
QMAKE_CXXFLAGS += /utf-8
|
||||||
|
QMAKE_CFLAGS += /utf-8
|
||||||
|
}
|
||||||
|
|
||||||
|
SOURCES += \
|
||||||
|
dataprototype.cpp \
|
||||||
|
datatypeconfigration.cpp \
|
||||||
|
main.cpp \
|
||||||
|
mapcore.cpp \
|
||||||
|
moduleinterface.cpp \
|
||||||
|
moduleprototype.cpp \
|
||||||
|
moduletreeview.cpp \
|
||||||
|
widget.cpp
|
||||||
|
|
||||||
|
HEADERS += \
|
||||||
|
dataprototype.h \
|
||||||
|
datatypeconfigration.h \
|
||||||
|
mapcore.h \
|
||||||
|
moduleinterface.h \
|
||||||
|
moduleprototype.h \
|
||||||
|
moduletreeview.h \
|
||||||
|
widget.h
|
||||||
|
|
||||||
|
# Default rules for deployment.
|
||||||
|
qnx: target.path = /tmp/$${TARGET}/bin
|
||||||
|
else: unix:!android: target.path = /opt/$${TARGET}/bin
|
||||||
|
!isEmpty(target.path): INSTALLS += target
|
|
@ -0,0 +1,150 @@
|
||||||
|
#include "dataprototype.h"
|
||||||
|
|
||||||
|
RuntimeItem::RuntimeItem(AssembleType t) : type_store(t) {}
|
||||||
|
|
||||||
|
RuntimeItem::RuntimeItem(const RuntimeItem &other) : RuntimeItem(other.baseType()) {
|
||||||
|
this->listener_collection.append(other.listener_collection);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<const RuntimeItem> RuntimeItem::add(std::shared_ptr<ItemListener> inst) const
|
||||||
|
{
|
||||||
|
if(this->listener_collection.contains(inst))
|
||||||
|
return this->shared_from_this();
|
||||||
|
|
||||||
|
auto ninst = std::const_pointer_cast<RuntimeItem>(this->clone());
|
||||||
|
ninst->listener_collection.append(inst);
|
||||||
|
itemNotify([ninst, this](std::shared_ptr<ItemListener> p) { p->itemHasbeenUpdated(ninst, this->shared_from_this()); });
|
||||||
|
return ninst;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<const RuntimeItem> RuntimeItem::del(std::shared_ptr<ItemListener> inst) const
|
||||||
|
{
|
||||||
|
if(!this->listener_collection.contains(inst))
|
||||||
|
return this->shared_from_this();
|
||||||
|
|
||||||
|
auto ninst = std::const_pointer_cast<RuntimeItem>(this->clone());
|
||||||
|
ninst->listener_collection.removeAll(inst);
|
||||||
|
itemNotify([ninst, this](std::shared_ptr<ItemListener> p) { p->itemHasbeenUpdated(ninst, this->shared_from_this()); });
|
||||||
|
return ninst;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RuntimeItem::itemNotify(std::function<void (std::shared_ptr<ItemListener>)> proc) const
|
||||||
|
{
|
||||||
|
for(auto < : listener_collection)
|
||||||
|
proc(lt);
|
||||||
|
}
|
||||||
|
|
||||||
|
AssembleType RuntimeItem::baseType() const { return type_store; }
|
||||||
|
|
||||||
|
qulonglong RuntimeItem::hashCode() const { return (qulonglong)this; }
|
||||||
|
|
||||||
|
std::shared_ptr<const RuntimeItem> RuntimeItem::clone() const{
|
||||||
|
return std::make_shared<RuntimeItem>(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
TypeTemplate::TypeTemplate() : RuntimeItem(AssembleType::DATAS_ASSEMBLE) {}
|
||||||
|
|
||||||
|
TypeTemplate::TypeTemplate(const TypeTemplate &other)
|
||||||
|
: RuntimeItem(other)
|
||||||
|
{
|
||||||
|
this->name_store = other.name_store;
|
||||||
|
this->type_store = other.type_store;
|
||||||
|
this->io_type = other.io_type;
|
||||||
|
this->comps_store = other.comps_store;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString TypeTemplate::name() const { return this->name_store; }
|
||||||
|
|
||||||
|
std::shared_ptr<const TypeTemplate> TypeTemplate::setName(const QString &val) const{
|
||||||
|
auto ninst = std::static_pointer_cast<TypeTemplate>(std::const_pointer_cast<RuntimeItem>(this->clone()));
|
||||||
|
ninst->name_store = val;
|
||||||
|
ninst->itemNotify([ninst, this](std::shared_ptr<ItemListener> p) { p->itemHasbeenUpdated(ninst, this->shared_from_this()); });
|
||||||
|
return ninst;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString TypeTemplate::type() const { return this->type_store; }
|
||||||
|
|
||||||
|
std::shared_ptr<const TypeTemplate> TypeTemplate::setType(const QString &val) const
|
||||||
|
{
|
||||||
|
auto ninst = std::static_pointer_cast<TypeTemplate>(std::const_pointer_cast<RuntimeItem>(this->clone()));
|
||||||
|
ninst->name_store = val;
|
||||||
|
ninst->itemNotify([ninst, this](std::shared_ptr<ItemListener> p) { p->itemHasbeenUpdated(ninst, this->shared_from_this()); });
|
||||||
|
return ninst;
|
||||||
|
}
|
||||||
|
|
||||||
|
DataOritation TypeTemplate::oritation() const { return io_type; }
|
||||||
|
|
||||||
|
std::shared_ptr<const TypeTemplate> TypeTemplate::setOritation(DataOritation t) const
|
||||||
|
{
|
||||||
|
auto ninst = std::static_pointer_cast<TypeTemplate>(std::const_pointer_cast<RuntimeItem>(this->clone()));
|
||||||
|
ninst->io_type = t;
|
||||||
|
ninst->itemNotify([ninst, this](std::shared_ptr<ItemListener> p) { p->itemHasbeenUpdated(ninst, this->shared_from_this()); });
|
||||||
|
return ninst;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<const RuntimeItem> TypeTemplate::clone() const
|
||||||
|
{
|
||||||
|
return std::make_shared<TypeTemplate>(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
DownAccess::DownAccess(std::shared_ptr<const RuntimeItem> peer) : runtime_item(peer) {}
|
||||||
|
|
||||||
|
DownAccess::DownAccess(const DownAccess &other)
|
||||||
|
{
|
||||||
|
this->runtime_item = other.runtime_item;
|
||||||
|
this->children_store = other.children_store;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<const RuntimeItem> DownAccess::itemPeer() const { return this->runtime_item; }
|
||||||
|
|
||||||
|
QList<std::shared_ptr<const DownAccess> > DownAccess::members() const { return this->children_store; }
|
||||||
|
|
||||||
|
std::shared_ptr<const DownAccess> DownAccess::append(std::shared_ptr<const DownAccess> child_inst) const{
|
||||||
|
if(this->children_store.contains(child_inst))
|
||||||
|
return this->shared_from_this();
|
||||||
|
|
||||||
|
auto ninst = std::const_pointer_cast<DownAccess>(this->clone());
|
||||||
|
ninst->children_store.append(child_inst);
|
||||||
|
itemPeer()->itemNotify(
|
||||||
|
[this, child_inst](std::shared_ptr<ItemListener> inst) {
|
||||||
|
inst->memberHasbeenAppended(*this->itemPeer(), child_inst->itemPeer());
|
||||||
|
});
|
||||||
|
|
||||||
|
return ninst;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<const DownAccess> DownAccess::remove(std::shared_ptr<const DownAccess> child_inst) const {
|
||||||
|
if(!this->children_store.contains(child_inst))
|
||||||
|
return this->shared_from_this();
|
||||||
|
|
||||||
|
auto ninst = std::const_pointer_cast<DownAccess>(this->clone());
|
||||||
|
itemPeer()->itemNotify(
|
||||||
|
[this, child_inst](std::shared_ptr<ItemListener> inst) {
|
||||||
|
inst->memberAboutToBeRemove(*this->itemPeer(), child_inst->itemPeer());
|
||||||
|
});
|
||||||
|
|
||||||
|
ninst->children_store.removeAll(child_inst);
|
||||||
|
return ninst;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<const DownAccess> DownAccess::replace(std::shared_ptr<const DownAccess> current, std::shared_ptr<const DownAccess> previous) const
|
||||||
|
{
|
||||||
|
return this->remove(previous)->append(current);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<const DownAccess> DownAccess::clone() const {
|
||||||
|
return std::make_shared<DownAccess>(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
UpAccess::UpAccess(std::shared_ptr<const UpAccess> parent, std::shared_ptr<const DownAccess> down):runtime_downward(down), parent_ptr(parent){}
|
||||||
|
|
||||||
|
UpAccess::UpAccess(const UpAccess &other) { runtime_downward = other.runtime_downward; }
|
||||||
|
|
||||||
|
std::shared_ptr<const DownAccess> UpAccess::downwardPeers() const
|
||||||
|
{
|
||||||
|
return this->runtime_downward;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<const UpAccess> UpAccess::parent() const { return parent_ptr; }
|
||||||
|
|
||||||
|
std::shared_ptr<const UpAccess> UpAccess::clone() const { return std::make_shared<const UpAccess>(*this); }
|
|
@ -0,0 +1,137 @@
|
||||||
|
#ifndef DATAPROTOTYPE_H
|
||||||
|
#define DATAPROTOTYPE_H
|
||||||
|
|
||||||
|
#include <QString>
|
||||||
|
#include <QList>
|
||||||
|
|
||||||
|
class RuntimeItem;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 实体观察接口
|
||||||
|
*/
|
||||||
|
class ItemListener{
|
||||||
|
public:
|
||||||
|
virtual ~ItemListener() = default;
|
||||||
|
|
||||||
|
virtual void itemHasbeenUpdated(std::shared_ptr<const RuntimeItem> current, std::shared_ptr<const RuntimeItem> previous) = 0;
|
||||||
|
|
||||||
|
virtual void memberHasbeenAppended(const RuntimeItem &parent, std::shared_ptr<const RuntimeItem> inst) = 0;
|
||||||
|
virtual void memberAboutToBeRemove(const RuntimeItem &parent, std::shared_ptr<const RuntimeItem> inst) = 0;
|
||||||
|
virtual void memberHasbeenReplaced(const RuntimeItem &parent, std::shared_ptr<const RuntimeItem> current, std::shared_ptr<const RuntimeItem> previous) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 聚合体类型
|
||||||
|
*/
|
||||||
|
enum class AssembleType {
|
||||||
|
DATAS_ASSEMBLE, // 数据聚合体
|
||||||
|
MODULES_UNIT, // 模块单元
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 内存实例接口
|
||||||
|
*/
|
||||||
|
class RuntimeItem : public std::enable_shared_from_this<RuntimeItem> {
|
||||||
|
public:
|
||||||
|
explicit RuntimeItem(AssembleType t);
|
||||||
|
explicit RuntimeItem(const RuntimeItem & other);
|
||||||
|
|
||||||
|
std::shared_ptr<const RuntimeItem> add(std::shared_ptr<ItemListener> inst) const;
|
||||||
|
std::shared_ptr<const RuntimeItem> del(std::shared_ptr<ItemListener> inst) const;
|
||||||
|
void itemNotify(std::function<void(std::shared_ptr<ItemListener>)> proc) const;
|
||||||
|
|
||||||
|
AssembleType baseType() const;
|
||||||
|
virtual qulonglong hashCode() const;
|
||||||
|
virtual std::shared_ptr<const RuntimeItem> clone() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
AssembleType type_store;
|
||||||
|
QList<std::shared_ptr<ItemListener>> listener_collection;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 下行实体访问接口
|
||||||
|
*/
|
||||||
|
class DownAccess : public std::enable_shared_from_this<DownAccess>{
|
||||||
|
public:
|
||||||
|
explicit DownAccess(std::shared_ptr<const RuntimeItem> peer);
|
||||||
|
explicit DownAccess(const DownAccess &other);
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
std::shared_ptr<const T> typePeer() const {
|
||||||
|
return std::dynamic_pointer_cast<const T>(itemPeer());
|
||||||
|
}
|
||||||
|
std::shared_ptr<const RuntimeItem> itemPeer() const;
|
||||||
|
QList<std::shared_ptr<const DownAccess>> members() const;
|
||||||
|
|
||||||
|
std::shared_ptr<const DownAccess> append(std::shared_ptr<const DownAccess> child_inst) const;
|
||||||
|
std::shared_ptr<const DownAccess> remove(std::shared_ptr<const DownAccess> child_inst) const;
|
||||||
|
std::shared_ptr<const DownAccess> replace(std::shared_ptr<const DownAccess> current, std::shared_ptr<const DownAccess> previous) const;
|
||||||
|
|
||||||
|
virtual std::shared_ptr<const DownAccess> clone() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::shared_ptr<const RuntimeItem> runtime_item;
|
||||||
|
QList<std::shared_ptr<const DownAccess>> children_store;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 上行访问接口
|
||||||
|
*/
|
||||||
|
class UpAccess : public std::enable_shared_from_this<UpAccess> {
|
||||||
|
public:
|
||||||
|
explicit UpAccess(std::shared_ptr<const UpAccess> parent, std::shared_ptr<const DownAccess> down);
|
||||||
|
explicit UpAccess(const UpAccess &other);
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
std::shared_ptr<const T> typePeer() const {
|
||||||
|
return std::dynamic_pointer_cast<const T>(itemPeer());
|
||||||
|
}
|
||||||
|
std::shared_ptr<const DownAccess> downwardPeers() const;
|
||||||
|
std::shared_ptr<const UpAccess> parent() const;
|
||||||
|
virtual std::shared_ptr<const UpAccess> clone() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::shared_ptr<const DownAccess> runtime_downward;
|
||||||
|
std::shared_ptr<const UpAccess> parent_ptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 定义数据传输方向
|
||||||
|
*/
|
||||||
|
enum class DataOritation {
|
||||||
|
INPUT, // 引入
|
||||||
|
OUTPUT, // 输出
|
||||||
|
CONSUME, // 引入消耗
|
||||||
|
GENERATE, // 引出生成
|
||||||
|
UNDEFINED, // 未定义
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* @brief 数据接口
|
||||||
|
*/
|
||||||
|
class TypeTemplate : public RuntimeItem
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
QString name_store = "foo";
|
||||||
|
QString type_store = "整形";
|
||||||
|
DataOritation io_type = DataOritation::UNDEFINED;
|
||||||
|
QHash<qulonglong, std::pair<std::shared_ptr<const TypeTemplate>, QString>> comps_store;
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit TypeTemplate();
|
||||||
|
explicit TypeTemplate(const TypeTemplate & other);
|
||||||
|
|
||||||
|
QString name() const;
|
||||||
|
std::shared_ptr<const TypeTemplate> setName(const QString &val) const;
|
||||||
|
|
||||||
|
QString type() const;
|
||||||
|
std::shared_ptr<const TypeTemplate> setType(const QString &val) const;
|
||||||
|
|
||||||
|
DataOritation oritation() const;
|
||||||
|
std::shared_ptr<const TypeTemplate> setOritation(DataOritation t) const;
|
||||||
|
|
||||||
|
virtual std::shared_ptr<const RuntimeItem> clone() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // DATAPROTOTYPE_H
|
|
@ -0,0 +1,85 @@
|
||||||
|
#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());
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
#ifndef DATATYPECONFIGRATION_H
|
||||||
|
#define DATATYPECONFIGRATION_H
|
||||||
|
|
||||||
|
#include <QPushButton>
|
||||||
|
#include <QStandardItemModel>
|
||||||
|
#include <QTableView>
|
||||||
|
#include <QTreeView>
|
||||||
|
#include <QWidget>
|
||||||
|
#include "mapcore.h"
|
||||||
|
#include "dataprototype.h"
|
||||||
|
|
||||||
|
class DataConfigration : public QWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
explicit DataConfigration(MapCore &core, std::shared_ptr<const DownAccess> target, QWidget *parent = nullptr);
|
||||||
|
|
||||||
|
private:
|
||||||
|
MapCore &core_bind;
|
||||||
|
std::shared_ptr<const DownAccess> target_bind;
|
||||||
|
QTableView *const member_present;
|
||||||
|
QStandardItemModel *const member_model;
|
||||||
|
QTreeView *const preview_present;
|
||||||
|
QStandardItemModel *const preview_model;
|
||||||
|
|
||||||
|
QPushButton *const append, *const remove;
|
||||||
|
|
||||||
|
void present_member(std::shared_ptr<const DownAccess> base);
|
||||||
|
void present_struct(std::shared_ptr<const DownAccess> base, QStandardItem *target = nullptr);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // DATATYPECONFIGRATION_H
|
|
@ -0,0 +1,26 @@
|
||||||
|
#include "widget.h"
|
||||||
|
|
||||||
|
#include <QApplication>
|
||||||
|
#include "mapcore.h"
|
||||||
|
#include "datatypeconfigration.h"
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
QApplication a(argc, argv);
|
||||||
|
// Widget w;
|
||||||
|
// w.show();
|
||||||
|
MapCore core;
|
||||||
|
auto target = std::make_shared<const DownAccess>(std::make_shared<TypeTemplate>());
|
||||||
|
core.setRoot(target);
|
||||||
|
auto tnode0 = std::make_shared<const DownAccess>(std::make_shared<TypeTemplate>());
|
||||||
|
auto tnode1 = std::make_shared<const DownAccess>(std::make_shared<TypeTemplate>());
|
||||||
|
auto tnode2 = std::make_shared<const DownAccess>(std::make_shared<TypeTemplate>());
|
||||||
|
tnode0 = tnode0->append(tnode1);
|
||||||
|
target = target->append(tnode0);
|
||||||
|
target = target->append(tnode2);
|
||||||
|
|
||||||
|
DataConfigration dialog(core, target);
|
||||||
|
dialog.show();
|
||||||
|
|
||||||
|
return a.exec();
|
||||||
|
}
|
|
@ -0,0 +1,84 @@
|
||||||
|
#include "mapcore.h"
|
||||||
|
|
||||||
|
MapCore::MapCore()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<const DownAccess> MapCore::root() const{ return root_bind; }
|
||||||
|
|
||||||
|
void MapCore::setRoot(std::shared_ptr<const DownAccess> root) { this->root_bind = root; }
|
||||||
|
|
||||||
|
std::shared_ptr<const DownAccess> MapCore::refreshRoot(std::shared_ptr<const DownAccess> old, std::shared_ptr<const DownAccess> _new){
|
||||||
|
MapVisitor visitor(*this);
|
||||||
|
|
||||||
|
auto links = visitor.findLink(old->itemPeer());
|
||||||
|
std::function<std::shared_ptr<const DownAccess>(std::shared_ptr<const UpAccess>, std::shared_ptr<const DownAccess>)> replace_cascade =
|
||||||
|
[&replace_cascade, this](std::shared_ptr<const UpAccess> current_up, std::shared_ptr<const DownAccess> current_new) -> std::shared_ptr<const DownAccess> {
|
||||||
|
auto pinst_up = current_up->parent();
|
||||||
|
if(!pinst_up)
|
||||||
|
return current_new;
|
||||||
|
|
||||||
|
auto pinst = pinst_up->downwardPeers();
|
||||||
|
auto new_pinst = pinst->replace(current_up->downwardPeers(), current_new);
|
||||||
|
return replace_cascade(pinst_up, new_pinst);
|
||||||
|
};
|
||||||
|
|
||||||
|
this->root_bind = replace_cascade(links, _new);
|
||||||
|
return this->root_bind;
|
||||||
|
}
|
||||||
|
|
||||||
|
MapVisitor::MapVisitor(MapCore &base) : core_bind(base) {}
|
||||||
|
|
||||||
|
std::shared_ptr<const DownAccess> MapVisitor::findTarget(std::shared_ptr<const RuntimeItem> node) const{
|
||||||
|
return find_target(core_bind.root(), node);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<const UpAccess> MapVisitor::findLink(std::shared_ptr<const RuntimeItem> node) const
|
||||||
|
{
|
||||||
|
return this->find_link(nullptr, core_bind.root(), node);
|
||||||
|
}
|
||||||
|
|
||||||
|
QList<std::shared_ptr<const DownAccess> > MapVisitor::collect(std::function<bool (std::shared_ptr<const DownAccess>)> proc) const{
|
||||||
|
return collect(core_bind.root(), proc);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<const UpAccess> MapVisitor::find_link(std::shared_ptr<const UpAccess> pinst, std::shared_ptr<const DownAccess> handle, std::shared_ptr<const RuntimeItem> node) const
|
||||||
|
{
|
||||||
|
if(handle->itemPeer() == node)
|
||||||
|
return std::make_shared<UpAccess>(pinst, handle);
|
||||||
|
|
||||||
|
auto target_ptr = std::make_shared<UpAccess>(pinst, handle);
|
||||||
|
for(auto &hc : handle->members()){
|
||||||
|
auto result = find_link(target_ptr, hc, node);
|
||||||
|
if(result)
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<const DownAccess> MapVisitor::find_target(std::shared_ptr<const DownAccess> handle, std::shared_ptr<const RuntimeItem> node) const {
|
||||||
|
if (handle->itemPeer() == node) {
|
||||||
|
return handle;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto &it : handle->members()) {
|
||||||
|
auto result = find_target(it, node);
|
||||||
|
if (result)
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
QList<std::shared_ptr<const DownAccess> > MapVisitor::collect(std::shared_ptr<const DownAccess> handle, std::function<bool (std::shared_ptr<const DownAccess>)> proc) const {
|
||||||
|
QList<std::shared_ptr<const DownAccess>> retlist;
|
||||||
|
if(proc(handle))
|
||||||
|
retlist.append(handle);
|
||||||
|
|
||||||
|
for(auto &c : handle->members())
|
||||||
|
retlist.append(collect(c, proc));
|
||||||
|
|
||||||
|
return retlist;
|
||||||
|
}
|
|
@ -0,0 +1,53 @@
|
||||||
|
#ifndef MAPCORE_H
|
||||||
|
#define MAPCORE_H
|
||||||
|
|
||||||
|
#include <QStandardItemModel>
|
||||||
|
#include "moduleprototype.h"
|
||||||
|
|
||||||
|
|
||||||
|
class MapCore
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
MapCore();
|
||||||
|
|
||||||
|
std::shared_ptr<const DownAccess> root() const;
|
||||||
|
void setRoot(std::shared_ptr<const DownAccess> root);
|
||||||
|
std::shared_ptr<const DownAccess> refreshRoot(std::shared_ptr<const DownAccess> old, std::shared_ptr<const DownAccess> _new);
|
||||||
|
|
||||||
|
QList<std::shared_ptr<const TypeTemplate>> dataTypes() const;
|
||||||
|
void typeAppend(std::shared_ptr<const TypeTemplate> type);
|
||||||
|
void typeRemove(std::shared_ptr<const TypeTemplate> type);
|
||||||
|
void typeUpdate(std::shared_ptr<const TypeTemplate> type);
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::shared_ptr<const DownAccess> root_bind = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
class MapVisitor{
|
||||||
|
public:
|
||||||
|
explicit MapVisitor(MapCore &base);
|
||||||
|
/**
|
||||||
|
* @brief 获取指定节点的访问句柄
|
||||||
|
* @param node
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
std::shared_ptr<const DownAccess> findTarget(std::shared_ptr<const RuntimeItem> node) const;
|
||||||
|
|
||||||
|
std::shared_ptr<const UpAccess> findLink(std::shared_ptr<const RuntimeItem> node) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 获取满足指定条件的节点
|
||||||
|
* @param proc
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
QList<std::shared_ptr<const DownAccess>> collect(std::function<bool(std::shared_ptr<const DownAccess>)> proc) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
MapCore &core_bind;
|
||||||
|
|
||||||
|
std::shared_ptr<const UpAccess> find_link(std::shared_ptr<const UpAccess> pinst, std::shared_ptr<const DownAccess> handle, std::shared_ptr<const RuntimeItem> node) const;
|
||||||
|
std::shared_ptr<const DownAccess> find_target(std::shared_ptr<const DownAccess> handle, std::shared_ptr<const RuntimeItem> node) const;
|
||||||
|
QList<std::shared_ptr<const DownAccess>> collect(std::shared_ptr<const DownAccess> handle, std::function<bool(std::shared_ptr<const DownAccess>)> proc) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // MAPCORE_H
|
|
@ -0,0 +1,7 @@
|
||||||
|
#include "moduleinterface.h"
|
||||||
|
|
||||||
|
ModuleInterface::ModuleInterface(MapCore &core, std::shared_ptr<const ModulePrototype> target, QWidget *parent)
|
||||||
|
: QWidget(parent), core_bind(core), target_bind(target)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
#ifndef MODULEINTERFACE_H
|
||||||
|
#define MODULEINTERFACE_H
|
||||||
|
|
||||||
|
#include <QWidget>
|
||||||
|
#include "moduleprototype.h"
|
||||||
|
#include "mapcore.h"
|
||||||
|
|
||||||
|
class ModuleInterface : public QWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
explicit ModuleInterface(MapCore &core, std::shared_ptr<const ModulePrototype> target, QWidget *parent = nullptr);
|
||||||
|
|
||||||
|
signals:
|
||||||
|
|
||||||
|
private:
|
||||||
|
MapCore &core_bind;
|
||||||
|
std::shared_ptr<const ModulePrototype> target_bind;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // MODULEINTERFACE_H
|
|
@ -0,0 +1,27 @@
|
||||||
|
#include "moduleprototype.h"
|
||||||
|
|
||||||
|
ModulePrototype::ModulePrototype()
|
||||||
|
: RuntimeItem(AssembleType::MODULES_UNIT)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
ModulePrototype::ModulePrototype(const ModulePrototype &other)
|
||||||
|
: RuntimeItem(other.baseType())
|
||||||
|
{
|
||||||
|
this->module_name = other.module_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString ModulePrototype::name() const { return this->module_name; }
|
||||||
|
|
||||||
|
std::shared_ptr<const ModulePrototype> ModulePrototype::setName(const QString &val) const{
|
||||||
|
auto ninst = std::static_pointer_cast<ModulePrototype>(std::const_pointer_cast<RuntimeItem>(this->clone()));
|
||||||
|
ninst->module_name = val;
|
||||||
|
ninst->itemNotify([ninst, this](std::shared_ptr<ItemListener> p) { p->itemHasbeenUpdated(ninst, this->shared_from_this()); });
|
||||||
|
return ninst;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<const RuntimeItem> ModulePrototype::clone() const
|
||||||
|
{
|
||||||
|
return std::make_shared<ModulePrototype>(*this);
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
#ifndef MODULEPROTOTYPE_H
|
||||||
|
#define MODULEPROTOTYPE_H
|
||||||
|
|
||||||
|
#include <QList>
|
||||||
|
#include <QHash>
|
||||||
|
#include <memory>
|
||||||
|
#include "dataprototype.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 模块原型
|
||||||
|
*/
|
||||||
|
class ModulePrototype : public RuntimeItem
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
QString module_name;
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit ModulePrototype();
|
||||||
|
explicit ModulePrototype(const ModulePrototype &other);
|
||||||
|
|
||||||
|
QString name() const;
|
||||||
|
std::shared_ptr<const ModulePrototype> setName(const QString &val) const;
|
||||||
|
|
||||||
|
virtual std::shared_ptr<const RuntimeItem> clone() const override;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif // MODULEPROTOTYPE_H
|
|
@ -0,0 +1,6 @@
|
||||||
|
#include "moduletreeview.h"
|
||||||
|
|
||||||
|
ModuleTreeView::ModuleTreeView()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
#ifndef MODULETREEVIEW_H
|
||||||
|
#define MODULETREEVIEW_H
|
||||||
|
|
||||||
|
|
||||||
|
class ModuleTreeView
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ModuleTreeView();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // MODULETREEVIEW_H
|
|
@ -0,0 +1,11 @@
|
||||||
|
#include "widget.h"
|
||||||
|
|
||||||
|
Widget::Widget(QWidget *parent)
|
||||||
|
: QWidget(parent)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget::~Widget()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue