WsParser_VS/StoryPresent/dag_layout.h

112 lines
3.9 KiB
C++

#pragma once
#include "data_type.h"
#include <QString>
#include <memory>
#include <QHash>
namespace dags {
/// <summary>
/// 节点分层辅助数据
/// </summary>
class DAGLayerHelper {
private:
graph_data::Node bind_node;
int input_count = 0;
QList<std::shared_ptr<DAGLayerHelper>> next_points;
int layer_v = 0;
public:
explicit DAGLayerHelper(const graph_data::Node& bind);
graph_data::Node bindPoint() const;
int& inputCount();
int layerValue() const;
void setLayerValue(int v);
void nextAppend(std::shared_ptr<DAGLayerHelper> inst);
QList<std::shared_ptr<DAGLayerHelper>> nextNodes() const;
};
/// <summary>
/// 节点排序辅助节点
/// </summary>
class DAGOrderHelper {
private:
std::shared_ptr<DAGLayerHelper> layer_bind = nullptr;
std::shared_ptr<DAGLayerHelper> relate_bind = nullptr;
std::shared_ptr<DAGLayerHelper> towards_to = nullptr;
int layer_number = 0;
QVariant sort_number;
QList<std::shared_ptr<DAGOrderHelper>> __prev_layer_nodes;
public:
/// <summary>
/// 构建一个可视图形节点
/// </summary>
/// <param name="bind">图形节点</param>
DAGOrderHelper(std::shared_ptr<DAGLayerHelper> bind);
/// <summary>
/// 构建一个辅助的不可视图形节点
/// </summary>
/// <param name="f">起始节点</param>
/// <param name="t">终止节点</param>
DAGOrderHelper(std::shared_ptr<DAGLayerHelper> f, std::shared_ptr<DAGLayerHelper> t);
bool isFakeNode() const;
std::shared_ptr<DAGLayerHelper> layerNode() const;
std::shared_ptr<DAGLayerHelper> tailsNode() const;
std::shared_ptr<DAGLayerHelper> headsNode() const;
int layerNumber() const;
void setLayerNumber(int v);
QVariant sortNumber() const;
void setSortNumber(double v);
QList<std::shared_ptr<DAGOrderHelper>> getUpstreamNodes() const;
void appendUpstreamNode(std::shared_ptr<DAGOrderHelper> inst);
};
class DAGGraph {
private:
QHash<QString, std::shared_ptr<DAGLayerHelper>> graph_inst;
QList<std::shared_ptr<DAGOrderHelper>> node_with_layout;
int max_layer_count = 0;
public:
void rebuildFromEdges(const QList<graph_data::Arrow>& arrow_list);
void primitiveGraphLayout();
void forwardsLayoutImpls();
void backwardsLayoutImpls();
void adjustLayoutImpls();
QList<std::shared_ptr<DAGOrderHelper>> nodeWithLayout() const;
int maxLayerCount() const;
private:
std::shared_ptr<DAGLayerHelper> spawns_peak(QList<std::shared_ptr<DAGLayerHelper>>& ref_set);
void graph_recovery(const QList<std::shared_ptr<DAGLayerHelper>> &sort_seqs);
int node_layering(const std::shared_ptr<DAGLayerHelper> &inst, int layer_current);
int node_layering_adj(std::shared_ptr<DAGLayerHelper> inst);
QList<std::shared_ptr<DAGOrderHelper>> tidy_graph_nodes();
void graph_layout_layers_forward(const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes);
QList<std::shared_ptr<DAGOrderHelper>> nodes_sort_forward_within_layer(int layer_index, const QList<std::shared_ptr<DAGOrderHelper>> &nodes);
void graph_adjust_layers_backward(const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes);
QList<std::shared_ptr<DAGOrderHelper>> layer_adjust_via_next_sibling(int curr_layer, const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes);
void node_adjust_via_next_sibling(std::shared_ptr<DAGOrderHelper> curr_node, const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes);
void graph_revise_layers_forward(const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes);
bool nodes_revise_springs_within_layer(int layer_index, const QList<std::shared_ptr<DAGOrderHelper>>& nodes);
double node_evaluate_with_siblings(std::shared_ptr<DAGOrderHelper> node, const QList<std::shared_ptr<DAGOrderHelper>>& nodes);
bool current_nodelist_filling_indi(const QList<std::shared_ptr<DAGOrderHelper>>& ordered_nodes);
void nodes_sort_with_above(int curr_layer, const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes);
void nodes_sort_with_belows(int curr_layer, const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes);
};
}