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