76 lines
2.9 KiB
C++
76 lines
2.9 KiB
C++
#include "common/core_model/diagram.h"
|
|
#include "diagramEditor/editorLayoutConfig.h"
|
|
#include <QStandardItem>
|
|
// layout_engine.h
|
|
/********editor布局生成核心类**********/
|
|
|
|
class DiagramEditorModel;
|
|
|
|
class DiagramLayoutEngine {
|
|
public:
|
|
struct Context {
|
|
int sourceId = 0;
|
|
bool saveToModel = false;
|
|
QMap<QString, QStandardItem*> itemCache;
|
|
QMap<QString, DiagramEditorComponentInfo> componentsCache;
|
|
QMap<QString, QSet<Direction>> branchUsedDirections; //key: 组件名 value: 已被支线占用的方向集合
|
|
|
|
void initComponentsCache(const QMap<QString, DiagramEditorComponentInfo>& compos) {
|
|
componentsCache = compos;
|
|
}
|
|
};
|
|
|
|
explicit DiagramLayoutEngine(DiagramEditorModel* model)
|
|
: m_model(model) {}
|
|
|
|
QRectF executeLayout(
|
|
QMap<QString, DiagramEditorRouteInfo>& routes,
|
|
QMap<QString, DiagramEditorComponentInfo>& components,
|
|
const LayoutConfig& config,
|
|
Context& context
|
|
);
|
|
|
|
private:
|
|
// 主线相关
|
|
QString findMainRoute(const QMap<QString, DiagramEditorRouteInfo>& routes);
|
|
void layoutMainRoute(DiagramEditorRouteInfo& route,
|
|
const LayoutConfig& config,
|
|
Context& context);
|
|
|
|
// 支线相关
|
|
void layoutBranchRoute(DiagramEditorRouteInfo& route,
|
|
const LayoutConfig& config,
|
|
Context& context);
|
|
void splitBranchRoute(DiagramEditorRouteInfo& route,
|
|
Context& context);
|
|
void layoutBranchSequence(QList<DiagramEditorComponentInfo>& sequence,
|
|
Direction branchDir,
|
|
const LayoutConfig& config,
|
|
Context& context,
|
|
bool isOrder,
|
|
int polarity);
|
|
void markDirectionUsed(const QString& compoName,Direction dir,Context& context);
|
|
// 组件相关
|
|
Direction determineBranchDirection(const DiagramEditorComponentInfo& currentNode,
|
|
Direction preferredDir,
|
|
Context& context);
|
|
QPoint getComponentPosition(const QString& componentName,
|
|
Context& context);
|
|
void updateComponent(DiagramEditorComponentInfo& compo,
|
|
int dir,
|
|
const QPoint& position,
|
|
int rotate,
|
|
Context& context);
|
|
|
|
// 辅助函数
|
|
QStandardItem* getNameItem(const QString& name, Context& context);
|
|
int getComponentDirection(const QString& compoName, Context& context);
|
|
QRectF calculateBoundingRect(const QMap<QString, DiagramEditorComponentInfo>& components);
|
|
Direction getRouteDirection(const QString& routeName,const QMap<QString, DiagramEditorRouteInfo>& routes);
|
|
|
|
private:
|
|
int m_compoWidth = 50;
|
|
int m_compoHeight = 30;
|
|
DiagramEditorModel* m_model = nullptr;
|
|
};
|