1 /************************************************************************
2  **
3  **  @file   vtoolendline.cpp
4  **  @author Roman Telezhynskyi <dismine(at)gmail.com>
5  **  @date   November 15, 2013
6  **
7  **  @brief
8  **  @copyright
9  **  This source code is part of the Valentina project, a pattern making
10  **  program, whose allow create and modeling patterns of clothing.
11  **  Copyright (C) 2013-2015 Valentina project
12  **  <https://gitlab.com/smart-pattern/valentina> All Rights Reserved.
13  **
14  **  Valentina is free software: you can redistribute it and/or modify
15  **  it under the terms of the GNU General Public License as published by
16  **  the Free Software Foundation, either version 3 of the License, or
17  **  (at your option) any later version.
18  **
19  **  Valentina is distributed in the hope that it will be useful,
20  **  but WITHOUT ANY WARRANTY; without even the implied warranty of
21  **  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22  **  GNU General Public License for more details.
23  **
24  **  You should have received a copy of the GNU General Public License
25  **  along with Valentina.  If not, see <http://www.gnu.org/licenses/>.
26  **
27  *************************************************************************/
28 
29 #include "vtoolendline.h"
30 
31 #include <QLineF>
32 #include <QPointF>
33 #include <QSharedPointer>
34 #include <QStaticStringData>
35 #include <QStringData>
36 #include <QStringDataPtr>
37 #include <new>
38 
39 #include "../../../../../dialogs/tools/dialogendline.h"
40 #include "../../../../../dialogs/tools/dialogtool.h"
41 #include "../../../../../visualization/visualization.h"
42 #include "../../../../../visualization/line/vistoolendline.h"
43 #include "../ifc/exception/vexception.h"
44 #include "../ifc/ifcdef.h"
45 #include "../vgeometry/vpointf.h"
46 #include "../vmisc/vabstractapplication.h"
47 #include "../vmisc/vcommonsettings.h"
48 #include "../vpatterndb/vcontainer.h"
49 #include "../vpatterndb/vtranslatevars.h"
50 #include "../vwidgets/vmaingraphicsscene.h"
51 #include "../../../../vabstracttool.h"
52 #include "../../../vdrawtool.h"
53 #include "vtoollinepoint.h"
54 
55 template <class T> class QSharedPointer;
56 
57 const QString VToolEndLine::ToolType = QStringLiteral("endLine");
58 
59 //---------------------------------------------------------------------------------------------------------------------
60 /**
61  * @brief VToolEndLine constructor.
62  * @param initData init data.
63  * @param parent parent object.
64  */
VToolEndLine(const VToolEndLineInitData & initData,QGraphicsItem * parent)65 VToolEndLine::VToolEndLine(const VToolEndLineInitData &initData, QGraphicsItem *parent)
66     :VToolLinePoint(initData.doc, initData.data, initData.id, initData.typeLine, initData.lineColor,
67                     initData.formulaLength, initData.basePointId, 0, initData.notes, parent),
68       formulaAngle(initData.formulaAngle)
69 {
70     ToolCreation(initData.typeCreation);
71 }
72 
73 //---------------------------------------------------------------------------------------------------------------------
74 /**
75  * @brief setDialog set dialog when user want change tool option.
76  */
setDialog()77 void VToolEndLine::setDialog()
78 {
79     SCASSERT(not m_dialog.isNull())
80     m_dialog->setModal(true);
81     QPointer<DialogEndLine> dialogTool = qobject_cast<DialogEndLine *>(m_dialog);
82     SCASSERT(not dialogTool.isNull())
83     const QSharedPointer<VPointF> p = VAbstractTool::data.GeometricObject<VPointF>(m_id);
84     dialogTool->SetTypeLine(m_lineType);
85     dialogTool->SetLineColor(lineColor);
86     dialogTool->SetFormula(formulaLength);
87     dialogTool->SetAngle(formulaAngle);
88     dialogTool->SetBasePointId(basePointId);
89     dialogTool->SetPointName(p->name());
90     dialogTool->SetNotes(m_notes);
91 }
92 
93 //---------------------------------------------------------------------------------------------------------------------
94 /**
95  * @brief Create help create tool from GUI.
96  * @param dialog dialog.
97  * @param scene pointer to scene.
98  * @param doc dom document container.
99  * @param data container with variables.
100  * @return the created tool
101  */
Create(const QPointer<DialogTool> & dialog,VMainGraphicsScene * scene,VAbstractPattern * doc,VContainer * data)102 VToolEndLine* VToolEndLine::Create(const QPointer<DialogTool> &dialog, VMainGraphicsScene *scene, VAbstractPattern *doc,
103                                    VContainer *data)
104 {
105     SCASSERT(not dialog.isNull())
106     const QPointer<DialogEndLine> dialogTool = qobject_cast<DialogEndLine *>(dialog);
107     SCASSERT(not dialogTool.isNull())
108 
109     VToolEndLineInitData initData;
110     initData.formulaLength = dialogTool->GetFormula();
111     initData.formulaAngle = dialogTool->GetAngle();
112     initData.basePointId = dialogTool->GetBasePointId();
113     initData.typeLine = dialogTool->GetTypeLine();
114     initData.lineColor = dialogTool->GetLineColor();
115     initData.name = dialogTool->GetPointName();
116     initData.scene = scene;
117     initData.doc = doc;
118     initData.data = data;
119     initData.parse = Document::FullParse;
120     initData.typeCreation = Source::FromGui;
121     initData.notes = dialogTool->GetNotes();
122 
123     VToolEndLine *point = Create(initData);
124     if (point != nullptr)
125     {
126         point->m_dialog = dialog;
127     }
128     return point;
129 }
130 
131 //---------------------------------------------------------------------------------------------------------------------
132 /**
133  * @brief Create help create tool.
134  * @param initData init data.
135  */
Create(VToolEndLineInitData & initData)136 VToolEndLine* VToolEndLine::Create(VToolEndLineInitData &initData)
137 {
138     const QSharedPointer<VPointF> basePoint = initData.data->GeometricObject<VPointF>(initData.basePointId);
139     QLineF line = QLineF(static_cast<QPointF>(*basePoint), QPointF(basePoint->x()+100, basePoint->y()));
140 
141     line.setAngle(CheckFormula(initData.id, initData.formulaAngle, initData.data)); //First set angle.
142     line.setLength(VAbstractValApplication::VApp()
143                    ->toPixel(CheckFormula(initData.id, initData.formulaLength, initData.data)));
144 
145     VPointF *p = new VPointF(line.p2(), initData.name, initData.mx, initData.my);
146     p->SetShowLabel(initData.showLabel);
147 
148     if (initData.typeCreation == Source::FromGui)
149     {
150         initData.id = initData.data->AddGObject(p);
151         initData.data->AddLine(initData.basePointId, initData.id);
152     }
153     else
154     {
155         initData.data->UpdateGObject(initData.id, p);
156         initData.data->AddLine(initData.basePointId, initData.id);
157         if (initData.parse != Document::FullParse)
158         {
159             initData.doc->UpdateToolData(initData.id, initData.data);
160         }
161     }
162 
163     if (initData.parse == Document::FullParse)
164     {
165         VAbstractTool::AddRecord(initData.id, Tool::EndLine, initData.doc);
166         VToolEndLine *point = new VToolEndLine(initData);
167         initData.scene->addItem(point);
168         InitToolConnections(initData.scene, point);
169         VAbstractPattern::AddTool(initData.id, point);
170         initData.doc->IncrementReferens(basePoint->getIdTool());
171         return point;
172     }
173     return nullptr;
174 }
175 
176 //---------------------------------------------------------------------------------------------------------------------
177 /**
178  * @brief SaveDialog save options into file after change in dialog.
179  */
SaveDialog(QDomElement & domElement,QList<quint32> & oldDependencies,QList<quint32> & newDependencies)180 void VToolEndLine::SaveDialog(QDomElement &domElement, QList<quint32> &oldDependencies,
181                               QList<quint32> &newDependencies)
182 {
183     SCASSERT(not m_dialog.isNull())
184     const QPointer<DialogEndLine> dialogTool = qobject_cast<DialogEndLine *>(m_dialog);
185     SCASSERT(not dialogTool.isNull())
186 
187     AddDependence(oldDependencies, basePointId);
188     AddDependence(newDependencies, dialogTool->GetBasePointId());
189 
190     doc->SetAttribute(domElement, AttrName, dialogTool->GetPointName());
191     doc->SetAttribute(domElement, AttrTypeLine, dialogTool->GetTypeLine());
192     doc->SetAttribute(domElement, AttrLineColor, dialogTool->GetLineColor());
193     doc->SetAttribute(domElement, AttrLength, dialogTool->GetFormula());
194     doc->SetAttribute(domElement, AttrAngle, dialogTool->GetAngle());
195     doc->SetAttribute(domElement, AttrBasePoint, QString().setNum(dialogTool->GetBasePointId()));
196 
197     const QString notes = dialogTool->GetNotes();
198     doc->SetAttributeOrRemoveIf(domElement, AttrNotes, notes, notes.isEmpty());
199 }
200 
201 //---------------------------------------------------------------------------------------------------------------------
SaveOptions(QDomElement & tag,QSharedPointer<VGObject> & obj)202 void VToolEndLine::SaveOptions(QDomElement &tag, QSharedPointer<VGObject> &obj)
203 {
204     VToolLinePoint::SaveOptions(tag, obj);
205 
206     doc->SetAttribute(tag, AttrType, ToolType);
207     doc->SetAttribute(tag, AttrLength, formulaLength);
208     doc->SetAttribute(tag, AttrAngle, formulaAngle);
209     doc->SetAttribute(tag, AttrBasePoint, basePointId);
210 }
211 
212 //---------------------------------------------------------------------------------------------------------------------
ReadToolAttributes(const QDomElement & domElement)213 void VToolEndLine::ReadToolAttributes(const QDomElement &domElement)
214 {
215     VToolLinePoint::ReadToolAttributes(domElement);
216 
217     m_lineType = doc->GetParametrString(domElement, AttrTypeLine, TypeLineLine);
218     lineColor = doc->GetParametrString(domElement, AttrLineColor, ColorBlack);
219     formulaLength = doc->GetParametrString(domElement, AttrLength, QString());
220     basePointId = doc->GetParametrUInt(domElement, AttrBasePoint, NULL_ID_STR);
221     formulaAngle = doc->GetParametrString(domElement, AttrAngle, QString());
222 }
223 
224 //---------------------------------------------------------------------------------------------------------------------
SetVisualization()225 void VToolEndLine::SetVisualization()
226 {
227     if (not vis.isNull())
228     {
229         VisToolEndLine *visual = qobject_cast<VisToolEndLine *>(vis);
230         SCASSERT(visual != nullptr)
231 
232         visual->setObject1Id(basePointId);
233         visual->setLength(VAbstractApplication::VApp()->TrVars()
234                           ->FormulaToUser(formulaLength, VAbstractApplication::VApp()->Settings()->GetOsSeparator()));
235         visual->SetAngle(VAbstractApplication::VApp()->TrVars()
236                          ->FormulaToUser(formulaAngle, VAbstractApplication::VApp()->Settings()->GetOsSeparator()));
237         visual->setLineStyle(LineStyleToPenStyle(m_lineType));
238         visual->RefreshGeometry();
239     }
240 }
241 
242 //---------------------------------------------------------------------------------------------------------------------
GetFormulaAngle() const243 VFormula VToolEndLine::GetFormulaAngle() const
244 {
245     VFormula fAngle(formulaAngle, getData());
246     fAngle.setCheckZero(false);
247     fAngle.setToolId(m_id);
248     fAngle.setPostfix(degreeSymbol);
249     fAngle.Eval();
250     return fAngle;
251 }
252 
253 //---------------------------------------------------------------------------------------------------------------------
SetFormulaAngle(const VFormula & value)254 void VToolEndLine::SetFormulaAngle(const VFormula &value)
255 {
256     if (value.error() == false)
257     {
258         formulaAngle = value.GetFormula(FormulaType::FromUser);
259 
260         QSharedPointer<VGObject> obj = VAbstractTool::data.GetGObject(m_id);
261         SaveOption(obj);
262     }
263 }
264 
265 //---------------------------------------------------------------------------------------------------------------------
ShowVisualization(bool show)266 void VToolEndLine::ShowVisualization(bool show)
267 {
268     ShowToolVisualization<VisToolEndLine>(show);
269 }
270 
271 //---------------------------------------------------------------------------------------------------------------------
ShowContextMenu(QGraphicsSceneContextMenuEvent * event,quint32 id)272 void VToolEndLine::ShowContextMenu(QGraphicsSceneContextMenuEvent *event, quint32 id)
273 {
274     try
275     {
276         ContextMenu<DialogEndLine>(event, id);
277     }
278     catch(const VExceptionToolWasDeleted &e)
279     {
280         Q_UNUSED(e)
281         return;//Leave this method immediately!!!
282     }
283 }
284