From ff64443ba6c4ab0da8a4f48c8a2f36451af93bbc Mon Sep 17 00:00:00 2001 From: Mirek Fidler Date: Wed, 9 Jul 2025 13:35:36 +0200 Subject: [PATCH] RichEdit: Developing Diagram --- uppsrc/RichEdit/DiagramEditor.cpp | 1 + uppsrc/RichEdit/DiagramEditor.h | 13 ++++++- uppsrc/RichEdit/DiagramMouse.cpp | 7 ++++ uppsrc/RichEdit/{Ops.cpp => DiagramOps.cpp} | 41 +++++++++++++++++++++ uppsrc/RichEdit/RichEdit.upp | 2 +- uppsrc/RichText/Diagram.cpp | 2 +- 6 files changed, 63 insertions(+), 3 deletions(-) rename uppsrc/RichEdit/{Ops.cpp => DiagramOps.cpp} (77%) diff --git a/uppsrc/RichEdit/DiagramEditor.cpp b/uppsrc/RichEdit/DiagramEditor.cpp index 7b5dbbe3d..aa079eae4 100644 --- a/uppsrc/RichEdit/DiagramEditor.cpp +++ b/uppsrc/RichEdit/DiagramEditor.cpp @@ -224,6 +224,7 @@ void DiagramEditor::Commit() SetBar(); Sync(); } + conns.Clear(); } String DiagramEditor::GetCurrent() diff --git a/uppsrc/RichEdit/DiagramEditor.h b/uppsrc/RichEdit/DiagramEditor.h index 8a16aa703..82533d680 100644 --- a/uppsrc/RichEdit/DiagramEditor.h +++ b/uppsrc/RichEdit/DiagramEditor.h @@ -60,8 +60,17 @@ private: bool grid = true; // snap to grid bool edit_text = false; // text editor is visible int zoom_percent = 100; + + struct Cn : Moveable { + int mi; // item index + int ci; // connection index + int li; // line item index + int pi; // point index + }; + + Vector conns; // connections, created at the drag start, updates line connections - BinUndoRedo undoredo; + BinUndoRedo undoredo; int tool = 0; ToolBar toolbar; @@ -103,6 +112,8 @@ private: Image ShapeIcon(int i); Image CapIcon(int start, int end); Image DashIcon(int i); + void PrepareConns(); + void UseConns(); void FixPositions(); diff --git a/uppsrc/RichEdit/DiagramMouse.cpp b/uppsrc/RichEdit/DiagramMouse.cpp index f0dbe074f..9eaedec79 100644 --- a/uppsrc/RichEdit/DiagramMouse.cpp +++ b/uppsrc/RichEdit/DiagramMouse.cpp @@ -98,6 +98,8 @@ void DiagramEditor::LeftDouble(Point p, dword keyflags) void DiagramEditor::LeftDown(Point p, dword keyflags) { + conns.Clear(); + Map(p); FinishText(); @@ -110,6 +112,7 @@ void DiagramEditor::LeftDown(Point p, dword keyflags) if(h.x || h.y) { draghandle = h; Sync(); + PrepareConns(); return; } } @@ -127,6 +130,7 @@ void DiagramEditor::LeftDown(Point p, dword keyflags) sdragfrom.SetCount(sel.GetCount()); for(int i = 0; i < sel.GetCount(); i++) sdragfrom[i] = data.item[sel[i]]; + PrepareConns(); draghandle = Null; } } @@ -185,6 +189,7 @@ void DiagramEditor::MouseMove(Point p, dword keyflags) Do(draghandle.y, m.pt[0].y, m.pt[1].y, p.y); } m.FixPosition(); + UseConns(); Sync(); return; } @@ -192,6 +197,8 @@ void DiagramEditor::MouseMove(Point p, dword keyflags) void DiagramEditor::LeftUp(Point p, dword keyflags) { + conns.Clear(); + Map(p); Sync(); diff --git a/uppsrc/RichEdit/Ops.cpp b/uppsrc/RichEdit/DiagramOps.cpp similarity index 77% rename from uppsrc/RichEdit/Ops.cpp rename to uppsrc/RichEdit/DiagramOps.cpp index 7bc6ad542..75370258b 100644 --- a/uppsrc/RichEdit/Ops.cpp +++ b/uppsrc/RichEdit/DiagramOps.cpp @@ -105,6 +105,47 @@ void DiagramEditor::Align(bool horz, int align) Commit(); } +void DiagramEditor::PrepareConns() +{ + conns.Clear(); + VectorMap>> map; + for(int pass = 0; pass < 2; pass++) + for(int i = 0; i < data.item.GetCount(); i++) { + const DiagramItem& m = data.item[i]; + if(m.IsLine() == pass) { + Vector cp = m.GetConnections(); + for(int j = 0; j < cp.GetCount(); j++) + map.GetAdd(cp[j]) << MakeTuple(i, j); + } + } + for(int i = 0; i < data.item.GetCount(); i++) { + const DiagramItem& m = data.item[i]; + if(m.IsLine()) { + for(int j = 0; j < 2; j++) { + auto *q = map.FindPtr(m.pt[j]); + if(q) { + for(auto w : *q) { + Cn& c = conns.Add(); + c.mi = w.a; + c.ci = w.b; + c.li = i; + c.pi = j; + } + } + } + } + } +} + +void DiagramEditor::UseConns() +{ + for(const Cn& cn: conns) + if(sel.Find(cn.li) < 0) + data.item[cn.li].pt[cn.pi] = data.item[cn.mi].GetConnections()[cn.ci]; +} + + + /* TODO remove struct SizeDlg : WithSizeLayout { diff --git a/uppsrc/RichEdit/RichEdit.upp b/uppsrc/RichEdit/RichEdit.upp index 332d59373..980e53325 100644 --- a/uppsrc/RichEdit/RichEdit.upp +++ b/uppsrc/RichEdit/RichEdit.upp @@ -32,7 +32,7 @@ file DiagramEditor.cpp, DiagramMouse.cpp, DiagramCursor.cpp, - Ops.cpp, + DiagramOps.cpp, ColumnPopUp.cpp, Bar.cpp, Text.cpp, diff --git a/uppsrc/RichText/Diagram.cpp b/uppsrc/RichText/Diagram.cpp index aaa8667a2..ca2651544 100644 --- a/uppsrc/RichText/Diagram.cpp +++ b/uppsrc/RichText/Diagram.cpp @@ -282,7 +282,7 @@ void DiagramItem::Paint(Painter& w, dword style) const if(style & EDITOR) for(Pointf p : GetConnections()) - w.Circle(p, 4).Stroke(1, 128 * SColorHighlight()); + w.Circle(p, 4).Stroke(1, 190 * SColorHighlight()); } }