OSDN Git Service

63c0e11c465ab676d69598ebcc8278a3cdf1469c
[dennco/denncoCreator.git] / Source / visualizer / eventhandler / dcvterminalfromreceptormodehandler.cpp
1 //  Copyright (c) 2012 Dennco Project
2 //
3 // This program is free software: you can redistribute it and/or modify
4 // it under the terms of the GNU General Public License as published by
5 // the Free Software Foundation, either version 3 of the License, or
6 // (at your option) any later version.
7 //
8 // This program is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 // GNU General Public License for more details.
12 //
13 // You should have received a copy of the GNU General Public License
14 // along with this program.  If not, see <http://www.gnu.org/licenses/>.
15
16 //
17 //  Created by tkawata on Sep-30, 2012.
18 //
19 #include "dcvterminalfromreceptormodehandler.h"
20
21 #include "dcvcpage.h"
22 #include "dcscene.h"
23 #include "dccreator.h"
24 #include "dcglwidget.h"
25
26 #include "dccell.h"
27 #include "dcreceptor.h"
28 #include "dcvceditmodecursor.h"
29 #include "dcglvisualizerwidget.h"
30
31 DCVTerminalFromReceptorModeHandler::DCVTerminalFromReceptorModeHandler(DCUIGraphicsScene *widget, DCCreator *creator, DCScene *scene, DCReceptor *editReceptor, DCVCEditModeCursor *cursor) :
32     DCVEventHandler(widget, creator, scene), d_inResigingDrag(false), d_editReceptor(editReceptor), d_cursor(cursor)
33 {
34
35 }
36
37 DCVTerminalFromReceptorModeHandler::~DCVTerminalFromReceptorModeHandler()
38 {
39
40 }
41
42 int DCVTerminalFromReceptorModeHandler::getHandlerType() const
43 {
44     return DCScene::DCV_EDITMODE_TERMINAL_FROM_RECEPTOR;
45 }
46
47 void DCVTerminalFromReceptorModeHandler::mousePressEvent(QGraphicsSceneMouseEvent *event)
48 {
49     bool shift = event->modifiers() & Qt::ShiftModifier;
50
51     QPointF mousePos = event->scenePos();
52
53     d_draggedObject.assign(NULL);
54
55     DCVComponent *obj = getView()->getObjectAt(mousePos.x(), mousePos.y(), d_cursor);
56     if (!obj)
57         return;
58
59     DCVCPage *page = dynamic_cast<DCVCPage*>(obj->getPageBelonging());
60     if (!page)
61         return;
62
63     if (obj !=  getScene()->getTerminalEditCursor() && obj != page)
64             return;
65
66     switch(getScene()->getPersMode())
67     {
68     case DCScene::DCV_PERSMODE_NAVIGATION:
69         {
70             if (obj != page)
71             {
72                 getController()->selectPage(this, page, shift);
73                 if (obj->getIsSelectable())
74                 {
75                     float pageX, pageZ;
76                     getView()->toObjectCoordinateXZ(mousePos.x(), mousePos.y(), page, &pageX, &pageZ);
77                     if (obj->startDrag(pageX, 0, pageZ, false))
78                     {
79                         getScene()->updateVisiblity();
80                         getView()->requestRedraw(true);
81                         d_draggedObject.assign(obj);
82                         d_inResigingDrag = false;
83                     }
84                 }
85             }
86             else
87             {
88                 d_draggedObject.assign(obj);
89                 d_inResigingDrag = false;
90             }
91         }
92         break;
93
94     case DCScene::DCV_PERSMODE_PAGEEDIT:
95         {
96             float pageX, pageZ;
97             getView()->toObjectCoordinateXZ(mousePos.x(), mousePos.y(), page, &pageX, &pageZ);
98             if (obj->startDrag(pageX, 0, pageZ, false))
99             {
100                 getScene()->updateVisiblity();
101                 getView()->requestRedraw(true);
102             }
103             d_draggedObject.assign(obj);
104             d_inResigingDrag = false;
105         }
106         break;
107     }
108
109     event->accept();
110 }
111
112 void DCVTerminalFromReceptorModeHandler::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
113 {
114     DCVComponent *obj = d_draggedObject.ref();
115
116     if (!obj)
117         return;
118
119     DCVComponent *page = obj->getPageBelonging();
120     if (!page)
121         return;
122
123     switch(getScene()->getPersMode())
124     {
125     case DCScene::DCV_PERSMODE_NAVIGATION:
126         {
127             getController()->changePersMode(this, DCCreator::DC_PERSMODE_PAGEEDIT);
128             d_draggedObject.assign(NULL);
129         }
130
131         break;
132
133     case DCScene::DCV_PERSMODE_PAGEEDIT:
134          {
135             if (obj == page)
136             {
137                 getController()->changePersMode(this, DCCreator::DC_PERSMODE_NAVIGATION);
138                 d_draggedObject.assign(NULL);
139             }
140             else if (obj == d_cursor)
141             {
142
143                 getController()->doCommandCancelAddAxonTerminal(this);
144             }
145
146         }
147         break;
148     }
149
150     event->accept();
151 }
152
153 void DCVTerminalFromReceptorModeHandler::mouseMoveEvent(QGraphicsSceneMouseEvent *event, int clickTimeElapsed)
154 {
155     QPointF mousePos = event->scenePos();
156     QPointF mousePrevPos = event->lastScenePos();
157
158     // This method will be called continuously while the mouse is moving.
159     // Some process we want to execute here may become heavyer and it will affect the performance.
160     // To privent this to affect the performance, we only execute the potentially heavyer
161     // process 12.5 times in a second in maximum.
162     static int lastCheckTime = 0;
163     bool canProcessHeavyTask = clickTimeElapsed - lastCheckTime < 0 || clickTimeElapsed - lastCheckTime >= 80;
164     if (canProcessHeavyTask)
165         lastCheckTime = clickTimeElapsed;
166
167     if (event->buttons() == Qt::LeftButton)
168     {
169         //dragging
170         bool shift = event->modifiers() & Qt::ShiftModifier;
171         float dx = mousePos.x() - mousePrevPos.x();
172         float dy = mousePos.y() - mousePrevPos.y();
173
174
175         if (canProcessHeavyTask && d_draggedObject.ref() && d_draggedObject.ref() != d_draggedObject.ref()->getPageBelonging())
176         {
177             d_draggedObject.ref()->setSelectable(false);
178             DCVComponent *obj = getView()->getObjectAt(mousePos.x(), mousePos.y());
179             d_draggedObject.ref()->setSelectable(true);
180             DCCell *cell = dynamic_cast<DCCell*>(d_editReceptor->getOwnerCell());
181
182             if (d_cursor->getDropTarget() && d_cursor->getDropTarget() != obj)
183             {
184                 getController()->unselectCellObject(this, d_cursor->getDropTarget());
185                 getController()->selectCellObject(this, cell->getVComponent());
186             }
187             if (obj && obj != obj->getPageBelonging() && obj->getPageBelonging() == d_draggedObject.ref()->getPageBelonging())
188             {
189                 getController()->selectCellObject(this, obj, true);
190                 d_cursor->setDropTarget(obj);
191             }
192             else
193             {
194                 d_cursor->setDropTarget(NULL);
195             }
196         }
197
198         switch(getScene()->getPersMode())
199         {
200         case DCScene::DCV_PERSMODE_NAVIGATION:
201             if (d_draggedObject.ref() && d_draggedObject.ref()->getPageBelonging() && d_draggedObject.ref() != d_draggedObject.ref()->getPageBelonging())
202             {
203                 float pageX, pageZ;
204                 getView()->toObjectCoordinateXZ(mousePos.x(), mousePos.y(), d_draggedObject.ref()->getPageBelonging(), &pageX, &pageZ);
205
206                 if (d_draggedObject.ref()->dragging(pageX, 0, pageZ, false))
207                 {
208                     DCGLWidget::singleton()->setCursor(Qt::OpenHandCursor);
209                     getView()->requestRedraw(false);
210                 }
211             }
212             else if (!shift)
213             {
214                 getController()->rotateScene(this, dy / 5.0, dx / 5.0);
215             }
216             else
217             {
218                 getController()->translateBrowsModeScene(this, dx, dy);
219             }
220             break;
221
222         case DCScene::DCV_PERSMODE_PAGEEDIT:
223             if (d_draggedObject.ref() && d_draggedObject.ref()->getPageBelonging())
224             {
225                 if (d_draggedObject.ref() == d_draggedObject.ref()->getPageBelonging())
226                 {
227                     getController()->translateEditModeScene(this, dx, dy);
228                 }
229                 else
230                 {
231                     float pageX, pageZ;
232                     getView()->toObjectCoordinateXZ(mousePos.x(), mousePos.y(), d_draggedObject.ref()->getPageBelonging(), &pageX, &pageZ);
233                     if (d_draggedObject.ref()->dragging(pageX, 0, pageZ, false))
234                     {
235                         DCGLWidget::singleton()->setCursor(Qt::OpenHandCursor);
236                         getView()->requestRedraw(false);
237                     }
238                 }
239             }
240             break;
241         }
242     }
243
244     event->accept();
245 }
246
247 void DCVTerminalFromReceptorModeHandler::mouseReleaseEvent(QGraphicsSceneMouseEvent *event, bool wasDrag)
248 {
249     bool shift = event->modifiers() & Qt::ShiftModifier;
250     QPointF mousePos = event->scenePos();
251
252     if (d_draggedObject.ref() && d_draggedObject.ref()->getPageBelonging())
253     {
254         float pageX, pageZ;
255         getView()->toObjectCoordinateXZ(mousePos.x(), mousePos.y(), d_draggedObject.ref()->getPageBelonging(), &pageX, &pageZ);
256         d_draggedObject.ref()->endDrag(pageX, 0, pageZ, d_inResigingDrag);
257     }
258
259     switch(getScene()->getPersMode())
260     {
261     case DCScene::DCV_PERSMODE_NAVIGATION:
262     {
263         DCVCPage *page = NULL;
264         if (d_draggedObject.ref())
265         {
266             page = d_draggedObject.ref()->getPageBelonging();
267         }
268
269         if (wasDrag)
270         {
271             if (d_cursor->getDropTarget())
272             {
273                 getController()->doCommandCommitAddAxonTerminal(this, d_cursor->getDropTarget()->getOwnerCell(), d_editReceptor);
274             }
275         }
276         else
277         {
278             if (page)
279             {
280                 getController()->selectPage(this, page, shift);
281                 d_cursor->changePageBelonging(page);
282             }
283             else
284             {
285                 getController()->unselectPageAll(this);
286             }
287         }
288     }
289         break;
290
291     case DCScene::DCV_PERSMODE_PAGEEDIT:
292         if (wasDrag)
293         {
294             if (d_cursor->getDropTarget())
295             {
296                 getController()->doCommandCommitAddAxonTerminal(this, d_cursor->getDropTarget()->getOwnerCell(), d_editReceptor);
297             }
298         }
299
300         break;
301     }
302
303     getScene()->updateVisiblity();
304     getView()->requestRedraw(true);
305     event->accept();
306 }
307
308 void DCVTerminalFromReceptorModeHandler::wheelEvent(QGraphicsSceneWheelEvent  *event)
309 {
310     if (event->isAccepted()) return;
311
312     getController()->changeSceneScale(this, getScene()->getScale() + event->delta()/5);
313
314     event->accept();
315 }
316
317 void DCVTerminalFromReceptorModeHandler::keyPressEvent(QKeyEvent *event)
318 {
319
320 }
321
322 void DCVTerminalFromReceptorModeHandler::keyReleaseEvent(QKeyEvent *event)
323 {
324
325 }
326
327 void DCVTerminalFromReceptorModeHandler::showContextMenu(const QPoint &pos)
328 {
329
330 }
331
332 void DCVTerminalFromReceptorModeHandler::selectedPageChanged(const void *requester)
333 {
334     if (requester == this)
335         return;
336
337     QList<DCVCPage*> pages = getScene()->getSelectedPages();
338     if (pages.length() == 0)
339         return;
340
341     if (d_cursor->getPageBelonging() != pages.at(0))
342         d_cursor->changePageBelonging(pages.at(0));
343
344 }
345