📄 lines.cpp
字号:
wxLineControlPoint *control = (wxLineControlPoint *)node->GetData();
control->SetX(point->x);
control->SetY(point->y);
node = node->GetNext();
control_node = control_node->GetNext();
}
}
}
#if wxUSE_PROLOGIO
void wxLineShape::WriteAttributes(wxExpr *clause)
{
wxShape::WriteAttributes(clause);
if (m_from)
clause->AddAttributeValue(_T("from"), m_from->GetId());
if (m_to)
clause->AddAttributeValue(_T("to"), m_to->GetId());
if (m_attachmentTo != 0)
clause->AddAttributeValue(_T("attachment_to"), (long)m_attachmentTo);
if (m_attachmentFrom != 0)
clause->AddAttributeValue(_T("attachment_from"), (long)m_attachmentFrom);
if (m_alignmentStart != 0)
clause->AddAttributeValue(_T("align_start"), (long)m_alignmentStart);
if (m_alignmentEnd != 0)
clause->AddAttributeValue(_T("align_end"), (long)m_alignmentEnd);
clause->AddAttributeValue(_T("is_spline"), (long)m_isSpline);
if (m_maintainStraightLines)
clause->AddAttributeValue(_T("keep_lines_straight"), (long)m_maintainStraightLines);
// Make a list of lists for the (sp)line controls
wxExpr *list = new wxExpr(wxExprList);
wxNode *node = m_lineControlPoints->GetFirst();
while (node)
{
wxRealPoint *point = (wxRealPoint *)node->GetData();
wxExpr *point_list = new wxExpr(wxExprList);
wxExpr *x_expr = new wxExpr((double) point->x);
wxExpr *y_expr = new wxExpr((double) point->y);
point_list->Append(x_expr);
point_list->Append(y_expr);
list->Append(point_list);
node = node->GetNext();
}
clause->AddAttributeValue(_T("controls"), list);
// Write arc arrows in new OGL format, if there are any.
// This is a list of lists. Each sublist comprises:
// (arrowType arrowEnd xOffset arrowSize)
if (m_arcArrows.GetCount() > 0)
{
wxExpr *arrow_list = new wxExpr(wxExprList);
node = m_arcArrows.GetFirst();
while (node)
{
wxArrowHead *head = (wxArrowHead *)node->GetData();
wxExpr *head_list = new wxExpr(wxExprList);
head_list->Append(new wxExpr((long)head->_GetType()));
head_list->Append(new wxExpr((long)head->GetArrowEnd()));
head_list->Append(new wxExpr(head->GetXOffset()));
head_list->Append(new wxExpr(head->GetArrowSize()));
head_list->Append(new wxExpr(wxExprString, head->GetName()));
head_list->Append(new wxExpr(head->GetId()));
// New members of wxArrowHead
head_list->Append(new wxExpr(head->GetYOffset()));
head_list->Append(new wxExpr(head->GetSpacing()));
arrow_list->Append(head_list);
node = node->GetNext();
}
clause->AddAttributeValue(_T("arrows"), arrow_list);
}
}
void wxLineShape::ReadAttributes(wxExpr *clause)
{
wxShape::ReadAttributes(clause);
int iVal = (int) m_isSpline;
clause->AssignAttributeValue(wxT("is_spline"), &iVal);
m_isSpline = (iVal != 0);
iVal = (int) m_maintainStraightLines;
clause->AssignAttributeValue(wxT("keep_lines_straight"), &iVal);
m_maintainStraightLines = (iVal != 0);
clause->AssignAttributeValue(wxT("align_start"), &m_alignmentStart);
clause->AssignAttributeValue(wxT("align_end"), &m_alignmentEnd);
// Compatibility: check for no regions.
if (m_regions.GetCount() == 0)
{
wxShapeRegion *newRegion = new wxShapeRegion;
newRegion->SetName(_T("Middle"));
newRegion->SetSize(150, 50);
m_regions.Append((wxObject *)newRegion);
if (m_text.GetCount() > 0)
{
newRegion->ClearText();
wxNode *node = m_text.GetFirst();
while (node)
{
wxShapeTextLine *textLine = (wxShapeTextLine *)node->GetData();
wxNode *next = node->GetNext();
newRegion->GetFormattedText().Append((wxObject *)textLine);
delete node;
node = next;
}
}
newRegion = new wxShapeRegion;
newRegion->SetName(wxT("Start"));
newRegion->SetSize(150, 50);
m_regions.Append((wxObject *)newRegion);
newRegion = new wxShapeRegion;
newRegion->SetName(wxT("End"));
newRegion->SetSize(150, 50);
m_regions.Append((wxObject *)newRegion);
}
m_attachmentTo = 0;
m_attachmentFrom = 0;
clause->AssignAttributeValue(wxT("attachment_to"), &m_attachmentTo);
clause->AssignAttributeValue(wxT("attachment_from"), &m_attachmentFrom);
wxExpr *line_list = NULL;
// When image is created, there are default control points. Override
// them if there are some in the file.
clause->AssignAttributeValue(wxT("controls"), &line_list);
if (line_list)
{
// Read a list of lists for the spline controls
if (m_lineControlPoints)
{
ClearPointList(*m_lineControlPoints);
}
else
m_lineControlPoints = new wxList;
wxExpr *node = line_list->value.first;
while (node)
{
wxExpr *xexpr = node->value.first;
double x = xexpr->RealValue();
wxExpr *yexpr = xexpr->next;
double y = yexpr->RealValue();
wxRealPoint *point = new wxRealPoint(x, y);
m_lineControlPoints->Append((wxObject*) point);
node = node->next;
}
}
// Read arrow list, for new OGL code
wxExpr *arrow_list = NULL;
clause->AssignAttributeValue(wxT("arrows"), &arrow_list);
if (arrow_list)
{
wxExpr *node = arrow_list->value.first;
while (node)
{
WXTYPE arrowType = ARROW_ARROW;
int arrowEnd = 0;
double xOffset = 0.0;
double arrowSize = 0.0;
wxString arrowName;
long arrowId = -1;
wxExpr *type_expr = node->Nth(0);
wxExpr *end_expr = node->Nth(1);
wxExpr *dist_expr = node->Nth(2);
wxExpr *size_expr = node->Nth(3);
wxExpr *name_expr = node->Nth(4);
wxExpr *id_expr = node->Nth(5);
// New members of wxArrowHead
wxExpr *yOffsetExpr = node->Nth(6);
wxExpr *spacingExpr = node->Nth(7);
if (type_expr)
arrowType = (WXTYPE)type_expr->IntegerValue();
if (end_expr)
arrowEnd = (int)end_expr->IntegerValue();
if (dist_expr)
xOffset = dist_expr->RealValue();
if (size_expr)
arrowSize = size_expr->RealValue();
if (name_expr)
arrowName = name_expr->StringValue();
if (id_expr)
arrowId = id_expr->IntegerValue();
if (arrowId == -1)
arrowId = wxNewId();
else
wxRegisterId(arrowId);
wxArrowHead *arrowHead = AddArrow(arrowType, arrowEnd, arrowSize, xOffset, arrowName, NULL, arrowId);
if (yOffsetExpr)
arrowHead->SetYOffset(yOffsetExpr->RealValue());
if (spacingExpr)
arrowHead->SetSpacing(spacingExpr->RealValue());
node = node->next;
}
}
}
#endif
void wxLineShape::Copy(wxShape& copy)
{
wxShape::Copy(copy);
wxASSERT( copy.IsKindOf(CLASSINFO(wxLineShape)) );
wxLineShape& lineCopy = (wxLineShape&) copy;
lineCopy.m_to = m_to;
lineCopy.m_from = m_from;
lineCopy.m_attachmentTo = m_attachmentTo;
lineCopy.m_attachmentFrom = m_attachmentFrom;
lineCopy.m_isSpline = m_isSpline;
lineCopy.m_alignmentStart = m_alignmentStart;
lineCopy.m_alignmentEnd = m_alignmentEnd;
lineCopy.m_maintainStraightLines = m_maintainStraightLines;
lineCopy.m_lineOrientations.Clear();
wxNode *node = m_lineOrientations.GetFirst();
while (node)
{
lineCopy.m_lineOrientations.Append(node->GetData());
node = node->GetNext();
}
if (lineCopy.m_lineControlPoints)
{
ClearPointList(*lineCopy.m_lineControlPoints);
delete lineCopy.m_lineControlPoints;
}
lineCopy.m_lineControlPoints = new wxList;
node = m_lineControlPoints->GetFirst();
while (node)
{
wxRealPoint *point = (wxRealPoint *)node->GetData();
wxRealPoint *new_point = new wxRealPoint(point->x, point->y);
lineCopy.m_lineControlPoints->Append((wxObject*) new_point);
node = node->GetNext();
}
// Copy arrows
lineCopy.ClearArrowsAtPosition(-1);
node = m_arcArrows.GetFirst();
while (node)
{
wxArrowHead *arrow = (wxArrowHead *)node->GetData();
lineCopy.m_arcArrows.Append(new wxArrowHead(*arrow));
node = node->GetNext();
}
}
// Override select, to create/delete temporary label-moving objects
void wxLineShape::Select(bool select, wxDC* dc)
{
wxShape::Select(select, dc);
if (select)
{
for (int i = 0; i < 3; i++)
{
wxNode *node = m_regions.Item(i);
if (node)
{
wxShapeRegion *region = (wxShapeRegion *)node->GetData();
if (region->m_formattedText.GetCount() > 0)
{
double w, h, x, y, xx, yy;
region->GetSize(&w, &h);
region->GetPosition(&x, &y);
GetLabelPosition(i, &xx, &yy);
if (m_labelObjects[i])
{
m_labelObjects[i]->Select(false);
m_labelObjects[i]->RemoveFromCanvas(m_canvas);
delete m_labelObjects[i];
}
m_labelObjects[i] = OnCreateLabelShape(this, region, w, h);
m_labelObjects[i]->AddToCanvas(m_canvas);
m_labelObjects[i]->Show(true);
if (dc)
m_labelObjects[i]->Move(*dc, (double)(x + xx), (double)(y + yy));
m_labelObjects[i]->Select(true, dc);
}
}
}
}
else
{
for (int i = 0; i < 3; i++)
{
if (m_labelObjects[i])
{
m_labelObjects[i]->Select(false, dc);
m_labelObjects[i]->Erase(*dc);
m_labelObjects[i]->RemoveFromCanvas(m_canvas);
delete m_labelObjects[i];
m_labelObjects[i] = NULL;
}
}
}
}
/*
* Line control point
*
*/
IMPLEMENT_DYNAMIC_CLASS(wxLineControlPoint, wxControlPoint)
wxLineControlPoint::wxLineControlPoint(wxShapeCanvas *theCanvas, wxShape *object, double size, double x, double y, int the_type):
wxControlPoint(theCanvas, object, size, x, y, the_type)
{
m_xpos = x;
m_ypos = y;
m_type = the_type;
m_point = NULL;
}
wxLineControlPoint::~wxLineControlPoint()
{
}
void wxLineControlPoint::OnDraw(wxDC& dc)
{
wxRectangleShape::OnDraw(dc);
}
// Implement movement of Line point
void wxLineControlPoint::OnDragLeft(bool draw, double x, double y, int keys, int attachment)
{
m_shape->GetEventHandler()->OnSizingDragLeft(this, draw, x, y, keys, attachment);
}
void wxLineControlPoint::OnBeginDragLeft(double x, double y, int keys, int attachment)
{
m_shape->GetEventHandler()->OnSizingBeginDragLeft(this, x, y, keys, attachment);
}
void wxLineControlPoint::OnEndDragLeft(double x, double y, int keys, int attachment)
{
m_shape->GetEventHandler()->OnSizingEndDragLeft(this, x, y, keys, attachment);
}
// Control points ('handles') redirect control to the actual shape, to make it easier
// to override sizing behaviour.
void wxLineShape::OnSizingDragLeft(wxControlPoint* pt, bool WXUNUSED(draw), double x, double y, int WXUNUSED(keys), int WXUNUSED(attachment))
{
wxLineControlPoint* lpt = (wxLineControlPoint*) pt;
wxClientDC dc(GetCanvas());
GetCanvas()->PrepareDC(dc);
dc.SetLogicalFunction(OGLRBLF);
wxPen dottedPen(*wxBLACK, 1, wxDOT);
dc.SetPen(dottedPen);
dc.SetBrush((* wxTRANSPARENT_BRUSH));
if (lpt->m_type == CONTROL_POINT_LINE)
{
m_canvas->Snap(&x, &y);
lpt->SetX(x); lpt->SetY(y);
lpt->m_point->x = x; lpt->m_point->y = y;
wxLineShape *lineShape = (wxLineShape *)this;
const wxPen *old_pen = lineShape->GetPen();
const wxBrush *old_brush = lineShape->GetBrush();
wxPen dottedPen(*wxBLACK, 1, wxDOT);
lineShape->SetPen(& dottedPen);
lineShape->SetBrush(wxTRANSPARENT_BRUSH);
lineShape->GetEventHandler()->OnMoveLink(dc, false);
lineShape->SetPen(old_pen);
lineShape->SetBrush(old_brush);
}
if (lpt->m_type == CONTROL_POINT_ENDPOINT_FROM || lpt->m_type == CONTROL_POINT_ENDPOINT_TO)
{
// lpt->SetX(x); lpt->SetY(y);
}
}
void wxLineShape::OnSizingBeginDragLeft(wxControlPoint* pt, double x, double y, int WXUNUSED(keys), int WXUNUSED(attachment))
{
wxLineControlPoint* lpt = (wxLineControlPoint*) pt;
wxClientDC dc(GetCanvas());
GetCanvas()->PrepareDC(dc);
wxLineShape *lineShape = (wxLineShape *)this;
if (lpt->m_type == CONTROL_POINT_LINE)
{
lpt->m_originalPos = * (lpt->m_point);
m_canvas->Snap(&x, &y);
this->Erase(dc);
// Redraw start and end objects because we've left holes
// when erasing the line
lineShape->GetFrom()->OnDraw(dc);
lineShape->GetFrom()->OnDrawContents(dc);
lineShape->GetTo()->OnDraw(dc);
lineShape->GetTo()->OnDrawContents(dc);
this->SetDisableLabel(true);
dc.SetLogicalFunction(OGLRBLF);
lpt->m_xpos = x; lpt->m_ypos = y;
lpt->m_point->x = x; lpt->m_point->y = y;
const wxPen *old_pen = lineShape->GetPen();
const wxBrush *old_brush = lineShape->GetBrush();
wxPen dottedPen(*wxBLACK, 1, wxDOT);
lineShape->SetPen(& dottedPen);
lineShape->SetBrush(wxTRANSPARENT_BRUSH);
lineShape->GetEventHandler()->OnMoveLink(dc, false);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -