From 30574c9e1faaf458f239351b2fe98a1f410d34aa Mon Sep 17 00:00:00 2001
From: codeboss <2422523675@qq.com>
Date: Wed, 31 Jul 2024 14:08:22 +0800
Subject: [PATCH] =?UTF-8?q?=E5=9F=BA=E6=9C=AC=E5=AE=8C=E6=88=90=E6=B8=B2?=
=?UTF-8?q?=E6=9F=93=E9=9B=8F=E5=BD=A2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.idea/workspace.xml | 2 -
frame/ContentView.py | 12 +--
graph/directed_acyclic_graph/DAGPresent.py | 82 +++++++++++-------
.../__pycache__/DAGPresent.cpython-312.pyc | Bin 15361 -> 16549 bytes
4 files changed, 57 insertions(+), 39 deletions(-)
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index edc6068..61f4fb4 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -7,9 +7,7 @@
-
-
diff --git a/frame/ContentView.py b/frame/ContentView.py
index 4e8259a..6070e3f 100644
--- a/frame/ContentView.py
+++ b/frame/ContentView.py
@@ -1,9 +1,11 @@
-from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout
-from graph.directed_acyclic_graph.DAGPresent import DAGActiveView, Direction
-from parse.StoryMap import StoryMap, FragmentSlice, XAST_ParseTool
-from graph.DataType import Arrow, Point
import sys
-from typing import Dict,List
+from typing import Dict, List
+
+from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout
+
+from graph.DataType import Arrow, Point
+from graph.directed_acyclic_graph.DAGPresent import DAGActiveView, Direction
+from parse.StoryMap import StoryMap, XAST_ParseTool
from parse.ast_load import global_ast_path
diff --git a/graph/directed_acyclic_graph/DAGPresent.py b/graph/directed_acyclic_graph/DAGPresent.py
index d0ba754..f29df4d 100644
--- a/graph/directed_acyclic_graph/DAGPresent.py
+++ b/graph/directed_acyclic_graph/DAGPresent.py
@@ -27,7 +27,7 @@ class StoryNodeType(Enum):
FragmentNode = 1,
-class StoryFragmentNode(QGraphicsItem, GraphNode):
+class ActivePresentNode(QGraphicsItem, GraphNode):
"""
故事情节名称节点
"""
@@ -112,24 +112,28 @@ class PenetrateNode(QGraphicsItem, GraphNode):
class TransitionCurve(QGraphicsItem):
- def __init__(self, start: GraphNode, end: GraphNode, parent):
+ def __init__(self, start: GraphNode, end: GraphNode, prev_layrer_width:float, parent):
QGraphicsItem.__init__(self, parent)
self.start_node = start
self.end_node = end
+ self.prev_layer_w = prev_layrer_width
self.outline = QRectF()
self.data_bind: object = None
pass
def layout_refresh(self):
- gpos = self.start_node.pos() + self.start_node.boundingRect().topRight()
- self.setPos(gpos)
-
orect = self.start_node.boundingRect()
erect = self.end_node.boundingRect()
- self.outline = QRectF(0, 0,
- self.end_node.pos().x() - self.start_node.pos().x() - orect.width(),
- self.end_node.pos().y() + erect.height() - self.start_node.pos().y())
- pass
+
+ xpos = self.start_node.pos().x() + self.start_node.boundingRect().width()
+ width_value = self.end_node.pos().x() - self.start_node.pos().x() - orect.width()
+
+ ypos = min(self.start_node.pos().y(), self.end_node.pos().y())
+ bottom_y = max(self.start_node.pos().y() + orect.height(), self.end_node.pos().y() + erect.height())
+
+ self.setPos(xpos, ypos)
+ self.outline = QRectF(0, 0, width_value, bottom_y - ypos)
+ self.update()
def boundingRect(self):
return self.outline
@@ -138,22 +142,31 @@ class TransitionCurve(QGraphicsItem):
def paint(self, painter, option, widget=...):
outline = self.outline
- painter.save()
- painter.setRenderHint(QPainter.RenderHint.Antialiasing)
start_rect = self.start_node.boundingRect()
end_rect = self.end_node.boundingRect()
+ aj_start_pos = self.start_node.pos() + QPointF(start_rect.width(), start_rect.height()/2)
+ aj_end_pos = self.end_node.pos() + QPointF(0, end_rect.height()/2)
+ line_span = self.prev_layer_w - start_rect.width()
- start_pos = QPointF(0, start_rect.height() / 2)
- control_pos0 = start_pos + QPointF(outline.width()/3, 0)
- end_pos = QPointF(outline.width(), outline.height() - end_rect.height() / 2)
- control_pos1 = end_pos + QPointF(-outline.width()/3, 0)
+ painter.save()
+ painter.setRenderHint(QPainter.RenderHint.Antialiasing)
+
+ #if aj_start_pos.y() < aj_end_pos.y():
+ start_pos = aj_start_pos - self.pos()
+ end_pos = aj_end_pos - self.pos()
+
+ line_epos = start_pos + QPointF(line_span, 0)
+ control_pos0 = line_epos + QPointF((outline.width() - line_span)/3, 0)
+ control_pos1 = end_pos - QPointF((outline.width() - line_span)/3, 0)
npen = QPen(Qt.black)
npen.setWidthF(4)
painter.setPen(npen)
+ painter.drawLine(start_pos, line_epos)
+
path0 = QPainterPath()
- path0.moveTo(start_pos)
+ path0.moveTo(line_epos)
path0.cubicTo(control_pos0, control_pos1, end_pos)
painter.drawPath(path0)
@@ -207,26 +220,26 @@ class DAGActiveView(QGraphicsView):
# 构建当前层节点
ypos_acc = 0
- all_graphics_nodes = []
+ current_graphics_nodes = []
for node in current_level_nodes:
if node.is_fake_node():
curr_gnode = PenetrateNode(20, None)
curr_gnode.setPos(previous_node_end, ypos_acc)
curr_gnode.attach_data(node)
ypos_acc += curr_gnode.boundingRect().height()
- all_graphics_nodes.append(curr_gnode)
+ current_graphics_nodes.append(curr_gnode)
self.scene_bind.addItem(curr_gnode)
else:
if node.layer_bind.bind_point().is_start:
- curr_gnode = StoryFragmentNode(node.layer_bind.bind_point().point_name, StoryNodeType.StoryStartNode,
- self.font(), None)
+ curr_gnode = ActivePresentNode(node.layer_bind.bind_point().point_name, StoryNodeType.StoryStartNode,
+ self.font(), None)
else:
- curr_gnode = StoryFragmentNode(node.layer_bind.bind_point().point_name, StoryNodeType.FragmentNode,
- self.font(), None)
+ curr_gnode = ActivePresentNode(node.layer_bind.bind_point().point_name, StoryNodeType.FragmentNode,
+ self.font(), None)
curr_gnode.attach_data(node)
curr_gnode.setPos(previous_node_end, ypos_acc)
ypos_acc += curr_gnode.boundingRect().height()
- all_graphics_nodes.append(curr_gnode)
+ current_graphics_nodes.append(curr_gnode)
self.scene_bind.addItem(curr_gnode)
pass
@@ -234,23 +247,28 @@ class DAGActiveView(QGraphicsView):
pass
# 调整同层节点宽度
- width_max = 0
- for n in all_graphics_nodes:
- width_max = max(width_max, n.boundingRect().width())
+ curr_layer_width = 0
+ for n in current_graphics_nodes:
+ curr_layer_width = max(curr_layer_width, n.boundingRect().width())
pass
- for n in all_graphics_nodes:
+ for n in current_graphics_nodes:
if hasattr(n, "resize_width"):
- n.resize_width(width_max)
+ n.resize_width(curr_layer_width)
pass
pass
- previous_node_end += width_max + self.layer_span
+ previous_node_end += curr_layer_width + self.layer_span
if len(previous_graphics_nodes) > 0:
- for curr_gnode in all_graphics_nodes:
+ prev_layer_width = 0
+ for n in previous_graphics_nodes:
+ prev_layer_width = max(prev_layer_width, n.boundingRect().width())
+ pass
+
+ for curr_gnode in current_graphics_nodes:
sort_helper: DAGOrderHelper = curr_gnode.get_data()
for prev_gnode in previous_graphics_nodes:
if prev_gnode.get_data() in sort_helper.get_upstream_nodes():
- line_cmbn = TransitionCurve(prev_gnode, curr_gnode, None)
+ line_cmbn = TransitionCurve(prev_gnode, curr_gnode, prev_layer_width,None)
self.scene_bind.addItem(line_cmbn)
line_cmbn.layout_refresh()
pass
@@ -258,7 +276,7 @@ class DAGActiveView(QGraphicsView):
pass
pass
- previous_graphics_nodes = all_graphics_nodes
+ previous_graphics_nodes = current_graphics_nodes
pass
pass
diff --git a/graph/directed_acyclic_graph/__pycache__/DAGPresent.cpython-312.pyc b/graph/directed_acyclic_graph/__pycache__/DAGPresent.cpython-312.pyc
index 92622b1247ce47f15da8c5dfeaff3ebc5b2bc659..a6faba88da781717ecccdbfc9c265d39fbf78fc8 100644
GIT binary patch
delta 3577
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
F{(l$Xu<`%^
delta 2675
zcmZ`*drVu`8NbKAeq8%rt}zCK@dMj{aU39_3APD@WC=+r%Y#BRl_hl?E=jOLh^}uE
zNG~JlP(xbQP-ds?kEUbOW(1O_4h2G-Z!Jwx(Lg&5dN&Wm+a}Quoh>3ffa!cg{7a
zsj?l(zw`_4;qmgjvnSuEyjL)9vUEv<;_yB(d1_$(L(_ir
zr0!<^_$A$H{apW~-@(85q#tD4)hFFt;Z;LL2j1;6m9>{->_NpIRP9ycrpIRfI(vB>cqbL}$UjsS5t-ykIaIxD`8`FRg{wBh0~P@iI54KB@-^RF6(T
zeR@IHr$0#x`Z2nP7U(gm#~>Im8Ukui_G+Yu$M#a2tdpq(v1&tN;C5M2g<(S%DC{+EXv35k#d6pLkIE`G
zi3L~|y9qQCD=k(K`8xV#=7xV_+VJ75B@_`qFmzJw_u>r#dA`*K%aAuHfWR76a)tWOmaL65ftf1?v0
z#gli9lGM5NI^t?rH})H*!n%W^4y$2S9Kw@WNx+REXO;%fJ>P%ow3IWZ`=rBzX>pkN
zw2HM6X+ME|1jwyxRa`G%jy`p6Fr70DihaFO&d|q@IbX&`U%c%l9G?Cg2241<==$ij
z(F`9@_<+h+PD|e#y*-)lJUk>fM_0KBIV_QN7z2===O4pNVxSu?{tMAQL;J#15&k
zPQ}}~)cr!HJE3$Z)b6C>P5%ES4ENbZ_QwT^ci*oZzwv$G%d{U=+K;O3FJ{`yk1OrR
z)%FvL_r$6}S1KS(2zJFtF`O8Hcf!qJ@i(DYpv_;e+o{*sailm7A2S{uzPLipRfsS*
zQ!K8;#sHfqSU6(9R@;UN&%|mUF-k=nHp~)3{<13s-6edTbL0;37%|DFFT!LxpSxJ3vi#8~N^(Ib=Yd*_
z$v9$_ttlUTROyGCoC7+xSxcngM%>)GFv7|#C|ogTnnQULt``fos$!E_w#dw!9zN&1
zaI}ikqf~_aq42nfE)N^>lokhY(w|6Q5YJ)=mx$d^TpjgjJSP;-6Pgq{&tO7m=%^0B
z#p-Ir!MCfo_?fhn6r}`VGuu0ORuTu#5M@iw)OS`O68J)Hn!I1w6RLB(iiPxcd|0iO
z-q`%c=5Z4QYJw;WuY`i5e{hsf?Vh@n@oiCjTU1}eJDrNJQFTPenXI$oPIM-Ew`I0v
zu61Fn5@}vYs=-}~bJsY#Y%iM%-Ku@F_N{sxv2%8(8riXM`u^bJpt|$W((_%)&Mqa=
zrP{m4OBS2HT228
zidCcl)dWHW$aRS^0+)d;-5isMr~wwzq)m=dD>~fvr}|eYJk9j4lIb%WgP}xc;8x8}
z{7u*fKi_nt>IO+B@O_d@m_9~jIsWoK3|IDv0nI)CjmWoj=q9jrG2^==?qxXcDuLs5
z*LgEmwSIpSckrt=_)p#29^J9OQq-%qFS@40<0x&6+va~-{|U_x$>zP(F%iE9i)=}?
z5o*{*IN5-WU&qD*xgc+(WiGX!c)b@WF)p=ltRol57J-^u|E7%a@cQ-$&p*LJKGi|e
zN)W|R6US(3LZY!Gn@0?jx`}_l-?zVqehqgU`wM@7mrN7(R)~I#;#~+w8_`E_JnBQY
z;Bs`#BNH<|Rle$
zQ4@T%slnh6F0o$tW>bQ#&NylnN9|1Nks}U&ZhDSyX#7$5UU)vTAg$_AbsOy85qiot
zvSZhm6F=Bd7cFy*w`Yq(pHVulcoHqUebda$)^#>#BDIvNp$x0Y~9R
zT2cdBn@gk9@kfr@tfQ287#e$6it|pF&2-;Q%qA3nv%)qnv7Tk#zEreHMs^b}f=K>p5FZk#A)wJy
zySBH8O5h&;rHPX~0vTZqBx5U;zJ0w1}&dr
zkq|500f$?=8vV#Sd0;xeMqy#?Sro{Y2+x@S