1 // Copyright (c) 2012 Dennco Project
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.
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.
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/>.
17 // Created by tkawata on Sep-30, 2012.
19 #include "dcvterminalfromaxonmodehandler.h"
21 #include "dcglvisualizerwidget.h"
22 #include "dcvcomponent.h"
25 #include "dccreator.h"
26 #include "dcglwidget.h"
30 #include "dcvceditmodecursor.h"
33 DCVTerminalFromAxonModeHandler::DCVTerminalFromAxonModeHandler(DCUIGraphicsScene *widget, DCCreator *creator, DCScene *scene, DCAxon *editAxon, DCVCEditModeCursor *cursor) :
34 DCVEventHandler(widget, creator, scene), d_draggedObject(NULL), d_inResigingDrag(false), d_editAxon(editAxon), d_cursor(cursor)
36 switch(getScene()->getEditMode())
38 case DCScene::DCV_EDITMODE_TERMINAL_FROM_AXON:
39 d_mode = TERMINAL_FROM_AXON;
41 case DCScene::DCV_EDITMODE_TERMINAL_FROM_RECEPTOR:
42 d_mode = TERMINAL_FROM_RECEPTOR;
49 DCVTerminalFromAxonModeHandler::~DCVTerminalFromAxonModeHandler()
51 d_cursor->setDropTarget(NULL);
54 int DCVTerminalFromAxonModeHandler::getHandlerType() const
56 if (d_mode == TERMINAL_FROM_AXON)
58 return DCScene::DCV_EDITMODE_TERMINAL_FROM_AXON;
62 return DCScene::DCV_EDITMODE_TERMINAL_FROM_RECEPTOR;
66 void DCVTerminalFromAxonModeHandler::mousePressEvent(QGraphicsSceneMouseEvent *event)
68 bool shift = event->modifiers() & Qt::ShiftModifier;
70 QPointF mousePos = event->scenePos();
72 DCVComponent *obj = getView()->getObjectAt(mousePos.x(), mousePos.y(), d_cursor);
76 DCVCPage *page = dynamic_cast<DCVCPage*>(obj->getPageBelonging());
80 if (obj != getScene()->getTerminalEditCursor() && obj != page)
83 switch(getScene()->getPersMode())
85 case DCScene::DCV_PERSMODE_NAVIGATION:
89 getController()->selectPage(this, page, shift);
90 if (obj->getIsSelectable())
93 getView()->toObjectCoordinateXZ(mousePos.x(), mousePos.y(), page, &pageX, &pageZ);
94 if (obj->startDrag(pageX, 0, pageZ, false))
96 getScene()->updateVisiblity();
97 getView()->requestRedraw(true);
98 d_draggedObject = obj;
99 d_inResigingDrag = false;
105 d_draggedObject = obj;
106 d_inResigingDrag = false;
111 case DCScene::DCV_PERSMODE_PAGEEDIT:
114 getView()->toObjectCoordinateXZ(mousePos.x(), mousePos.y(), page, &pageX, &pageZ);
115 if (obj->startDrag(pageX, 0, pageZ, false))
117 getScene()->updateVisiblity();
118 getView()->requestRedraw(true);
120 d_draggedObject = obj;
121 d_inResigingDrag = false;
129 void DCVTerminalFromAxonModeHandler::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
131 DCVComponent *obj = d_draggedObject;
136 DCVComponent *page = obj->getPageBelonging();
140 switch(getScene()->getPersMode())
142 case DCScene::DCV_PERSMODE_NAVIGATION:
144 getController()->changePersMode(this, DCCreator::DC_PERSMODE_PAGEEDIT);
145 d_draggedObject = NULL;
150 case DCScene::DCV_PERSMODE_PAGEEDIT:
154 getController()->changePersMode(this, DCCreator::DC_PERSMODE_NAVIGATION);
155 d_draggedObject = NULL;
157 else if (obj == d_cursor)
160 getController()->doCommandCancelAddAxonTerminal(this);
170 void DCVTerminalFromAxonModeHandler::mouseMoveEvent(QGraphicsSceneMouseEvent *event, int clickTimeElapsed)
172 QPointF mousePos = event->scenePos();
173 QPointF mousePrevPos = event->lastScenePos();
175 // This method will be called continuously while the mouse is moving.
176 // Some process we want to execute here may become heavyer and it will affect the performance.
177 // To privent this to affect the performance, we only execute the potentially heavyer
178 // process 12.5 times in a second in maximum.
179 static int lastCheckTime = 0;
180 bool canProcessHeavyTask = clickTimeElapsed - lastCheckTime < 0 || clickTimeElapsed - lastCheckTime >= 80;
181 if (canProcessHeavyTask)
182 lastCheckTime = clickTimeElapsed;
184 if (event->buttons() == Qt::LeftButton)
187 bool shift = event->modifiers() & Qt::ShiftModifier;
188 float dx = mousePos.x() - mousePrevPos.x();
189 float dy = mousePos.y() - mousePrevPos.y();
192 if (canProcessHeavyTask && d_draggedObject && d_draggedObject != d_draggedObject->getPageBelonging())
194 d_draggedObject->setSelectable(false);
195 DCVComponent *obj = getView()->getObjectAt(mousePos.x(), mousePos.y());
196 d_draggedObject->setSelectable(true);
198 if (d_cursor->getDropTarget() && d_cursor->getDropTarget() != obj)
200 getController()->unselectCellObject(this, d_cursor->getDropTarget());
201 getController()->selectCellObject(this, d_editAxon->getOwnerCell()->getVComponent());
203 if (obj && obj != obj->getPageBelonging() && obj->getPageBelonging() == d_draggedObject->getPageBelonging())
205 getController()->selectCellObject(this, obj, true);
206 d_cursor->setDropTarget(obj);
210 d_cursor->setDropTarget(NULL);
214 switch(getScene()->getPersMode())
216 case DCScene::DCV_PERSMODE_NAVIGATION:
217 if (d_draggedObject && d_draggedObject->getPageBelonging() && d_draggedObject != d_draggedObject->getPageBelonging())
220 getView()->toObjectCoordinateXZ(mousePos.x(), mousePos.y(), d_draggedObject->getPageBelonging(), &pageX, &pageZ);
222 if (d_draggedObject->dragging(pageX, 0, pageZ, false))
224 DCGLWidget::singleton()->setCursor(Qt::OpenHandCursor);
225 getView()->requestRedraw(false);
230 getController()->rotateScene(this, dy / 5.0, dx / 5.0);
234 getController()->translateBrowsModeScene(this, dx, dy);
238 case DCScene::DCV_PERSMODE_PAGEEDIT:
239 if (d_draggedObject && d_draggedObject->getPageBelonging())
241 if (d_draggedObject == d_draggedObject->getPageBelonging())
243 getController()->translateEditModeScene(this, dx, dy);
248 getView()->toObjectCoordinateXZ(mousePos.x(), mousePos.y(), d_draggedObject->getPageBelonging(), &pageX, &pageZ);
249 if (d_draggedObject->dragging(pageX, 0, pageZ, false))
251 DCGLWidget::singleton()->setCursor(Qt::OpenHandCursor);
252 getView()->requestRedraw(false);
263 void DCVTerminalFromAxonModeHandler::mouseReleaseEvent(QGraphicsSceneMouseEvent *event, bool wasDrag)
265 bool shift = event->modifiers() & Qt::ShiftModifier;
266 QPointF mousePos = event->scenePos();
268 if (d_draggedObject && d_draggedObject->getPageBelonging())
271 getView()->toObjectCoordinateXZ(mousePos.x(), mousePos.y(), d_draggedObject->getPageBelonging(), &pageX, &pageZ);
272 d_draggedObject->endDrag(pageX, 0, pageZ, d_inResigingDrag);
275 switch(getScene()->getPersMode())
277 case DCScene::DCV_PERSMODE_NAVIGATION:
279 DCVCPage *page = NULL;
282 page = d_draggedObject->getPageBelonging();
287 if (d_cursor->getDropTarget())
289 getController()->doCommandCommitAddAxonTerminal(this, d_editAxon, d_cursor->getDropTarget()->getOwnerCell());
296 getController()->selectPage(this, page, shift);
297 d_cursor->changePageBelonging(page);
301 getController()->unselectPageAll(this);
307 case DCScene::DCV_PERSMODE_PAGEEDIT:
310 if (d_cursor->getDropTarget())
312 getController()->doCommandCommitAddAxonTerminal(this, d_editAxon, d_cursor->getDropTarget()->getOwnerCell());
319 getScene()->updateVisiblity();
320 getView()->requestRedraw(true);
324 void DCVTerminalFromAxonModeHandler::wheelEvent(QGraphicsSceneWheelEvent *event)
326 if (event->isAccepted()) return;
328 getController()->changeSceneScale(this, getScene()->getScale() + event->delta()/5);
333 void DCVTerminalFromAxonModeHandler::keyPressEvent(QKeyEvent *event)
338 void DCVTerminalFromAxonModeHandler::keyReleaseEvent(QKeyEvent *event)