对外提供布局调整入口
This commit is contained in:
parent
e1ddd85af5
commit
dd6398223c
|
@ -468,7 +468,94 @@ void dags::DAGGraph::nodes_sort_with_belows(int curr_layer, const QList<std::sha
|
|||
}
|
||||
}
|
||||
|
||||
void dags::DAGGraph::graphLayout() {
|
||||
void dags::DAGGraph::node_adjust_ingraph_forward(const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes)
|
||||
{
|
||||
int layer_index = 0;
|
||||
while (this->node_adjust_inlayer_forward(layer_index, total_nodes)) {
|
||||
layer_index++;
|
||||
}
|
||||
}
|
||||
|
||||
bool dags::DAGGraph::node_adjust_inlayer_forward(int curr_layer, const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes)
|
||||
{
|
||||
// 挑选当前层次节点
|
||||
QList<std::shared_ptr<DAGOrderHelper>> curr_layer_nodes;
|
||||
std::copy_if(total_nodes.begin(), total_nodes.end(), std::back_inserter(curr_layer_nodes),
|
||||
[&](std::shared_ptr<DAGOrderHelper> inst) { return inst->layerNumber() == curr_layer; });
|
||||
|
||||
if (!curr_layer_nodes.size())
|
||||
return false;
|
||||
|
||||
// 计算排序系数
|
||||
QList<std::tuple<std::shared_ptr<DAGOrderHelper>, qlonglong, qlonglong>> orders_helper;
|
||||
std::transform(curr_layer_nodes.begin(), curr_layer_nodes.end(), std::back_inserter(orders_helper),
|
||||
[&](std::shared_ptr<DAGOrderHelper> ins) {
|
||||
auto val = this->node_evaluate_with_downstream(ins, total_nodes);
|
||||
return std::make_tuple(ins, val.first, val.second);
|
||||
});
|
||||
|
||||
// 排序当前层次节点
|
||||
std::sort(orders_helper.begin(), orders_helper.end(),
|
||||
[](std::tuple<std::shared_ptr<DAGOrderHelper>, qlonglong, qlonglong> a, std::tuple<std::shared_ptr<DAGOrderHelper>, qlonglong, qlonglong> b) {
|
||||
if (std::get<1>(a) == std::get<1>(b))
|
||||
return std::get<2>(a) < std::get<2>(b);
|
||||
|
||||
return std::get<1>(a) < std::get<1>(b);
|
||||
});
|
||||
|
||||
QList<int> sort_values;
|
||||
std::transform(curr_layer_nodes.begin(), curr_layer_nodes.end(), std::back_inserter(sort_values),
|
||||
[](std::shared_ptr<DAGOrderHelper> ins) { return ins->sortNumber().toInt(); });
|
||||
std::sort(sort_values.begin(), sort_values.end());
|
||||
|
||||
// 重新设定节点次序
|
||||
for (auto idx = 0; idx < sort_values.size(); ++idx) {
|
||||
std::get<0>(orders_helper[idx])->setSortNumber(sort_values[idx]);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
std::pair<qlonglong, qlonglong> dags::DAGGraph::node_evaluate_with_downstream(std::shared_ptr<DAGOrderHelper> node, const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes)
|
||||
{
|
||||
decltype(node) next_node;
|
||||
if (node->isFakeNode()) {
|
||||
auto n_data = node->headsNode();
|
||||
next_node = *std::find_if(total_nodes.begin(), total_nodes.end(), [&](decltype(node) n) {
|
||||
if (!n->isFakeNode()) {
|
||||
return n->layerNode() == n_data;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
}
|
||||
else {
|
||||
auto n_datas = node->layerNode()->nextNodes();
|
||||
if (!n_datas.size())
|
||||
return std::make_pair(node->layerNumber(), node->sortNumber().toLongLong());
|
||||
|
||||
QList<std::shared_ptr<DAGOrderHelper>> next_nodes;
|
||||
std::transform(n_datas.begin(), n_datas.end(), std::back_inserter(next_nodes),
|
||||
[&](std::shared_ptr<DAGLayerHelper> inst) {
|
||||
auto rst = std::find_if(total_nodes.begin(), total_nodes.end(), [&](decltype(node) n) {
|
||||
if (!n->isFakeNode()) {
|
||||
return n->layerNode() == inst;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
return *rst;
|
||||
});
|
||||
next_node = *std::min_element(next_nodes.begin(), next_nodes.end(),
|
||||
[](std::shared_ptr<DAGOrderHelper> a, std::shared_ptr<DAGOrderHelper> b) {
|
||||
if (a->layerNumber() == b->layerNumber())
|
||||
return a->sortNumber() < b->sortNumber();
|
||||
return a->layerNumber() < b->layerNumber();
|
||||
});
|
||||
}
|
||||
|
||||
return std::make_pair(next_node->layerNumber(), next_node->sortNumber().toLongLong());
|
||||
}
|
||||
|
||||
void dags::DAGGraph::primitiveGraphLayout() {
|
||||
QList<std::shared_ptr<DAGLayerHelper>> sort_seqs;
|
||||
QList<std::shared_ptr<DAGLayerHelper>> refs;
|
||||
while (1) {
|
||||
|
@ -493,12 +580,21 @@ void dags::DAGGraph::graphLayout() {
|
|||
auto tidy_nodes = this->tidy_graph_nodes();
|
||||
this->graph_layer_nodes_sort_forward(0, tidy_nodes);
|
||||
this->node_with_layout = tidy_nodes;
|
||||
}
|
||||
|
||||
int times = 1;
|
||||
while (times--) {
|
||||
this->graph_adjust_after_layout(tidy_nodes);
|
||||
this->graph_layer_nodes_sort_forward(0, tidy_nodes);
|
||||
}
|
||||
void dags::DAGGraph::forwardsLayoutImpls()
|
||||
{
|
||||
this->graph_layer_nodes_sort_forward(0, this->node_with_layout);
|
||||
}
|
||||
|
||||
void dags::DAGGraph::backwardsLayoutImpls()
|
||||
{
|
||||
this->graph_adjust_after_layout(this->node_with_layout);
|
||||
}
|
||||
|
||||
void dags::DAGGraph::adjustLayoutImpls()
|
||||
{
|
||||
this->node_adjust_ingraph_forward(this->node_with_layout);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -76,7 +76,10 @@ namespace dags {
|
|||
|
||||
public:
|
||||
void rebuildFromEdges(const QList<graph_data::Arrow>& arrow_list);
|
||||
void graphLayout();
|
||||
void primitiveGraphLayout();
|
||||
void forwardsLayoutImpls();
|
||||
void backwardsLayoutImpls();
|
||||
void adjustLayoutImpls();
|
||||
|
||||
QList<std::shared_ptr<DAGOrderHelper>> nodeWithLayout() const;
|
||||
int maxLayerCount() const;
|
||||
|
@ -97,5 +100,16 @@ namespace dags {
|
|||
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);
|
||||
|
||||
void node_adjust_ingraph_forward(const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes);
|
||||
bool node_adjust_inlayer_forward(int curr_layer, const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes);
|
||||
/**
|
||||
* .
|
||||
*
|
||||
* \param node
|
||||
* \param total_nodes
|
||||
* \return <²ã´Î£¬ÅÅÐòÖµ>
|
||||
*/
|
||||
std::pair<qlonglong, qlonglong> node_evaluate_with_downstream(std::shared_ptr<DAGOrderHelper> node, const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes);
|
||||
|
||||
};
|
||||
}
|
||||
|
|
|
@ -145,7 +145,7 @@ void TransitionCurve::paint(QPainter* painter, const QStyleOptionGraphicsItem* o
|
|||
}
|
||||
|
||||
DAGActiveView::DAGActiveView(QWidget* parent)
|
||||
: QGraphicsView(parent) {
|
||||
: QGraphicsView(parent), _layout_engine(new DAGGraph){
|
||||
this->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
|
||||
this->setScene(&this->scene_bind);
|
||||
|
||||
|
@ -240,16 +240,10 @@ QList<IGraphNode*> DAGActiveView::layer_nodes_construction(const QHash<IGraphNod
|
|||
|
||||
#include <QTextEdit>
|
||||
void DAGActiveView::updateWithEdges(QList<graph_data::Arrow> arrows) {
|
||||
// 헌뇜뎠품柬暠
|
||||
this->scene_bind.clear();
|
||||
this->total_graph_nodes.clear();
|
||||
_layout_engine->rebuildFromEdges(arrows);
|
||||
_layout_engine->primitiveGraphLayout();
|
||||
|
||||
DAGGraph tools;
|
||||
tools.rebuildFromEdges(arrows);
|
||||
tools.graphLayout();
|
||||
|
||||
auto total_nodes = tools.nodeWithLayout();
|
||||
total_graph_nodes = this->layer_nodes_construction(QHash<IGraphNode*, std::shared_ptr<DAGOrderHelper>>(), total_nodes);
|
||||
this->refreshGraph();
|
||||
}
|
||||
|
||||
void DAGActiveView::highlightGraphLink(const QList<graph_data::Arrow> arrows) {
|
||||
|
@ -307,6 +301,21 @@ void DAGActiveView::highlightGraphLink(const QList<graph_data::Arrow> arrows) {
|
|||
this->update();
|
||||
}
|
||||
|
||||
DAGGraph* dags::DAGActiveView::layoutEngine() const
|
||||
{
|
||||
return this->_layout_engine;
|
||||
}
|
||||
|
||||
void dags::DAGActiveView::refreshGraph()
|
||||
{
|
||||
// Çå³ýµ±Ç°ÊÓͼ
|
||||
this->scene_bind.clear();
|
||||
this->total_graph_nodes.clear();
|
||||
|
||||
auto total_nodes = _layout_engine->nodeWithLayout();
|
||||
total_graph_nodes = this->layer_nodes_construction(QHash<IGraphNode*, std::shared_ptr<DAGOrderHelper>>(), total_nodes);
|
||||
}
|
||||
|
||||
void DAGActiveView::mousePressEvent(QMouseEvent* ev) {
|
||||
QGraphicsView::mousePressEvent(ev);
|
||||
|
||||
|
|
|
@ -103,6 +103,8 @@ namespace dags {
|
|||
QList<IGraphNode*> highlight_nodelist;
|
||||
QList<IGraphNode*> total_graph_nodes;
|
||||
|
||||
DAGGraph *const _layout_engine;
|
||||
|
||||
signals:
|
||||
void nodeClicked(const QPointF &pos, const QList<QString> &node_name);
|
||||
|
||||
|
@ -112,6 +114,9 @@ namespace dags {
|
|||
void updateWithEdges(QList<graph_data::Arrow> arrows);
|
||||
void highlightGraphLink(const QList<graph_data::Arrow> color_path);
|
||||
|
||||
DAGGraph* layoutEngine() const;
|
||||
void refreshGraph();
|
||||
|
||||
// QGraphicsView
|
||||
virtual void mousePressEvent(QMouseEvent *ev) override;
|
||||
|
||||
|
|
|
@ -16,6 +16,11 @@ StoryPresent::StoryPresent(QWidget* parent)
|
|||
auto view = mbar->addMenu(u8"视图");
|
||||
view->addAction(u8"缩小", this, &StoryPresent::lesser, Qt::CTRL + Qt::Key_N);
|
||||
view->addAction(u8"放大", this, &StoryPresent::bigger, Qt::CTRL + Qt::Key_P);
|
||||
|
||||
auto layout = mbar->addMenu(u8"²¼¾Öµ÷Õû");
|
||||
layout->addAction(u8"ÕýÏò²¼¾Ö", this, &StoryPresent::forwardLayout);
|
||||
layout->addAction(u8"ÄæÏò²¼¾Ö", this, &StoryPresent::backwardLayout);
|
||||
layout->addAction(u8"µ÷Õû²¼¾Ö", this, &StoryPresent::adjustLayout);
|
||||
}
|
||||
|
||||
StoryPresent::~StoryPresent()
|
||||
|
@ -79,3 +84,21 @@ void StoryPresent::lesser()
|
|||
trans_base.scale(_scale_value, _scale_value);
|
||||
this->_story_present->setTransform(trans_base);
|
||||
}
|
||||
|
||||
void StoryPresent::forwardLayout()
|
||||
{
|
||||
this->_story_present->layoutEngine()->forwardsLayoutImpls();
|
||||
this->_story_present->refreshGraph();
|
||||
}
|
||||
|
||||
void StoryPresent::backwardLayout()
|
||||
{
|
||||
this->_story_present->layoutEngine()->backwardsLayoutImpls();
|
||||
this->_story_present->refreshGraph();
|
||||
}
|
||||
|
||||
void StoryPresent::adjustLayout()
|
||||
{
|
||||
this->_story_present->layoutEngine()->adjustLayoutImpls();
|
||||
this->_story_present->refreshGraph();
|
||||
}
|
||||
|
|
|
@ -20,4 +20,8 @@ private:
|
|||
|
||||
void bigger();
|
||||
void lesser();
|
||||
|
||||
void forwardLayout();
|
||||
void backwardLayout();
|
||||
void adjustLayout();
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue