Salome HOME
Bugfix: duplicated commit on "Return" and crash on "Return" with no active operations
[modules/shaper.git] / src / PartSet / PartSet_OperationFeatureEditMulti.cpp
1 // File:        PartSet_OperationFeatureEditMulti.h
2 // Created:     05 May 2014
3 // Author:      Natalia ERMOLAEVA
4
5 #include <PartSet_OperationFeatureEditMulti.h>
6 #include <PartSet_Tools.h>
7 #include <PartSet_OperationSketch.h>
8
9 #include <ModuleBase_OperationDescription.h>
10 #include <ModuleBase_ViewerPrs.h>
11
12 #include <ModelAPI_Events.h>
13
14 #include <SketchPlugin_Feature.h>
15 #include <GeomDataAPI_Point2D.h>
16 #include <ModelAPI_Data.h>
17 #include <ModelAPI_Document.h>
18
19 #include <ModelAPI_Events.h>
20
21 #include <Events_Loop.h>
22
23 #include <SketchPlugin_Line.h>
24
25 #include <V3d_View.hxx>
26
27 #ifdef _DEBUG
28 #include <QDebug>
29 #endif
30
31 #include <QMouseEvent>
32
33 using namespace std;
34
35 PartSet_OperationFeatureEditMulti::PartSet_OperationFeatureEditMulti(const QString& theId,
36                                                                      QObject* theParent,
37                                                                      FeaturePtr theFeature)
38     : PartSet_OperationSketchBase(theId, theParent),
39       mySketch(theFeature),
40       myIsBlockedSelection(false)
41 {
42 }
43
44 PartSet_OperationFeatureEditMulti::~PartSet_OperationFeatureEditMulti()
45 {
46 }
47
48
49 void PartSet_OperationFeatureEditMulti::initSelection(
50     const std::list<ModuleBase_ViewerPrs>& theSelected,
51     const std::list<ModuleBase_ViewerPrs>& theHighlighted)
52 {
53   if (!theHighlighted.empty()) {
54     // if there is highlighted object, we check whether it is in the list of selected objects
55     // in that case this object is a handle of the moved lines. If there no such object in the selection,
56     // the hightlighted object should moved and the selection is skipped. The skipped selection will be
57     // deselected in the viewer by blockSelection signal in the startOperation method.
58     bool isSelected = false;
59     std::list<ModuleBase_ViewerPrs>::const_iterator anIt = theSelected.begin(), aLast = theSelected
60         .end();
61     for (; anIt != aLast && !isSelected; anIt++) {
62       isSelected = ModelAPI_Feature::feature((*anIt).object()) == feature();
63     }
64     if (!isSelected)
65       myFeatures = theHighlighted;
66     else
67       myFeatures = theSelected;
68   } else
69     myFeatures = theSelected;
70 }
71
72 void PartSet_OperationFeatureEditMulti::initFeature(FeaturePtr theFeature)
73 {
74   setEditingFeature(theFeature);
75 }
76
77 FeaturePtr PartSet_OperationFeatureEditMulti::sketch() const
78 {
79   return mySketch;
80 }
81
82 void PartSet_OperationFeatureEditMulti::mousePressed(
83     QMouseEvent* theEvent, Handle(V3d_View) theView,
84     const std::list<ModuleBase_ViewerPrs>& /*theSelected*/,
85     const std::list<ModuleBase_ViewerPrs>& theHighlighted)
86 {
87 }
88
89 void PartSet_OperationFeatureEditMulti::mouseMoved(QMouseEvent* theEvent, Handle(V3d_View) theView)
90 {
91   if (!(theEvent->buttons() & Qt::LeftButton))
92     return;
93
94   gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), theView);
95
96   blockSelection(true);
97   if (myCurPoint.myIsInitialized) {
98     double aCurX, aCurY;
99     PartSet_Tools::convertTo2D(myCurPoint.myPoint, sketch(), theView, aCurX, aCurY);
100
101     double aX, anY;
102     PartSet_Tools::convertTo2D(aPoint, sketch(), theView, aX, anY);
103
104     double aDeltaX = aX - aCurX;
105     double aDeltaY = anY - aCurY;
106
107     boost::shared_ptr<SketchPlugin_Feature> aSketchFeature = boost::dynamic_pointer_cast<
108         SketchPlugin_Feature>(feature());
109     aSketchFeature->move(aDeltaX, aDeltaY);
110
111     std::list<ModuleBase_ViewerPrs>::const_iterator anIt = myFeatures.begin(), aLast = myFeatures
112         .end();
113     for (; anIt != aLast; anIt++) {
114       ObjectPtr aObject = (*anIt).object();
115       if (!aObject || aObject == feature())
116         continue;
117       FeaturePtr aFeature = ModelAPI_Feature::feature(aObject);
118       if (aFeature) {
119         aSketchFeature = boost::dynamic_pointer_cast<SketchPlugin_Feature>(aFeature);
120         if (aSketchFeature)
121           aSketchFeature->move(aDeltaX, aDeltaY);
122       }
123     }
124   }
125   sendFeatures();
126
127   myCurPoint.setPoint(aPoint);
128 }
129
130 void PartSet_OperationFeatureEditMulti::mouseReleased(
131     QMouseEvent* theEvent, Handle(V3d_View) theView,
132     const std::list<ModuleBase_ViewerPrs>& /*theSelected*/,
133     const std::list<ModuleBase_ViewerPrs>& /*theHighlighted*/)
134 {
135   if (commit()) {
136     std::list<ModuleBase_ViewerPrs> aFeatures = myFeatures;
137     std::list<ModuleBase_ViewerPrs>::const_iterator anIt = aFeatures.begin(), aLast =
138         aFeatures.end();
139     for (; anIt != aLast; anIt++) {
140       ObjectPtr aFeature = (*anIt).object();
141       if (aFeature) {
142         emit featureConstructed(aFeature, FM_Deactivation);
143       }
144     }
145   }
146 }
147
148 void PartSet_OperationFeatureEditMulti::startOperation()
149 {
150   PartSet_OperationSketchBase::startOperation();
151   emit multiSelectionEnabled(false);
152
153   blockSelection(true);
154
155   myCurPoint.clear();
156 }
157
158 void PartSet_OperationFeatureEditMulti::stopOperation()
159 {
160   emit multiSelectionEnabled(true);
161
162   blockSelection(false, true);
163
164   myFeatures.clear();
165 }
166
167 void PartSet_OperationFeatureEditMulti::blockSelection(bool isBlocked,
168                                                        const bool isRestoreSelection)
169 {
170   if (myIsBlockedSelection == isBlocked)
171     return;
172
173   myIsBlockedSelection = isBlocked;
174   QList<ObjectPtr> aFeatureList;
175   std::list<ModuleBase_ViewerPrs>::const_iterator anIt = myFeatures.begin(), aLast =
176       myFeatures.end();
177   /*for(; anIt != aLast; anIt++)
178    aFeatureList.append((*anIt).feature());*/
179   if (isBlocked) {
180     emit setSelection(QList<ObjectPtr>());
181     emit stopSelection(aFeatureList, true);
182   } else {
183     emit stopSelection(aFeatureList, false);
184     if (isRestoreSelection) {
185       emit setSelection(aFeatureList);
186     }
187   }
188 }
189
190 void PartSet_OperationFeatureEditMulti::sendFeatures()
191 {
192   static Events_ID anEvent = Events_Loop::eventByName(EVENT_OBJECT_MOVED);
193
194   std::list<FeaturePtr> aFeatures;
195   std::list<ModuleBase_ViewerPrs>::const_iterator anIt = myFeatures.begin(), aLast =
196       myFeatures.end();
197   for (; anIt != aLast; anIt++) {
198     ObjectPtr aFeature = (*anIt).object();
199     if (!aFeature)
200       continue;
201
202     ModelAPI_EventCreator::get()->sendUpdated(aFeature, anEvent);
203   }
204   Events_Loop::loop()->flush(anEvent);
205   flushUpdated();
206 }
207