GridFrame/diagramCavas/include/diagramEditor/editorDiagramLayoutEngine.h

67 lines
2.4 KiB
C++

#include "common/core_model/diagram.h"
#include "diagramEditor/editorLayoutConfig.h"
#include <QStandardItem>
// layout_engine.h
/********editor布局生成核心类**********/
class DiagramLayoutEngine {
public:
struct Context {
int sourceId = 0;
bool saveToModel = false;
QMap<QString, QStandardItem*> itemCache;
QMap<QString, DiagramEditorComponentInfo> componentsCache;
void initComponentsCache(const QMap<QString, DiagramEditorComponentInfo>& compos) {
componentsCache = compos;
}
};
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);
// 组件相关
Direction determineBranchDirection(const DiagramEditorComponentInfo& currentNode,
Direction preferredDir,
Context& context);
QPoint getComponentPosition(const QString& componentName,
Context& context);
void updateComponent(DiagramEditorComponentInfo& compo,
Direction 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);
private:
int m_compoWidth = 50;
int m_compoHeight = 30;
};