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 "dcvterminalfromreceptormodehandler.h"
23 #include "dccreator.h"
24 #include "dcglwidget.h"
27 #include "dcreceptor.h"
28 #include "dcvceditmodecursor.h"
29 #include "dcglvisualizerwidget.h"
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)
37 DCVTerminalFromReceptorModeHandler::~DCVTerminalFromReceptorModeHandler()
42 int DCVTerminalFromReceptorModeHandler::getHandlerType() const
44 return DCScene::DCV_EDITMODE_TERMINAL_FROM_RECEPTOR;
47 void DCVTerminalFromReceptorModeHandler::mousePressEvent(QGraphicsSceneMouseEvent *event)
49 bool shift = event->modifiers() & Qt::ShiftModifier;
51 QPointF mousePos = event->scenePos();
53 d_draggedObject.assign(NULL);
55 DCVComponent *obj = getView()->getObjectAt(mousePos.x(), mousePos.y(), d_cursor);
59 DCVCPage *page = dynamic_cast<DCVCPage*>(obj->getPageBelonging());
63 if (obj != getScene()->getTerminalEditCursor() && obj != page)
66 switch(getScene()->getPersMode())
68 case DCScene::DCV_PERSMODE_NAVIGATION:
72 getController()->selectPage(this, page, shift);
73 if (obj->getIsSelectable())
76 getView()->toObjectCoordinateXZ(mousePos.x(), mousePos.y(), page, &pageX, &pageZ);
77 if (obj->startDrag(pageX, 0, pageZ, false))
79 getScene()->updateVisiblity();
80 getView()->requestRedraw(true);
81 d_draggedObject.assign(obj);
82 d_inResigingDrag = false;
88 d_draggedObject.assign(obj);
89 d_inResigingDrag = false;
94 case DCScene::DCV_PERSMODE_PAGEEDIT:
97 getView()->toObjectCoordinateXZ(mousePos.x(), mousePos.y(), page, &pageX, &pageZ);
98 if (obj->startDrag(pageX, 0, pageZ, false))
100 getScene()->updateVisiblity();
101 getView()->requestRedraw(true);
103 d_draggedObject.assign(obj);
104 d_inResigingDrag = false;
112 void DCVTerminalFromReceptorModeHandler::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
114 DCVComponent *obj = d_draggedObject.ref();
119 DCVComponent *page = obj->getPageBelonging();
123 switch(getScene()->getPersMode())
125 case DCScene::DCV_PERSMODE_NAVIGATION:
127 getController()->changePersMode(this, DCCreator::DC_PERSMODE_PAGEEDIT);
128 d_draggedObject.assign(NULL);
133 case DCScene::DCV_PERSMODE_PAGEEDIT:
137 getController()->changePersMode(this, DCCreator::DC_PERSMODE_NAVIGATION);
138 d_draggedObject.assign(NULL);
140 else if (obj == d_cursor)
143 getController()->doCommandCancelAddAxonTerminal(this);
153 void DCVTerminalFromReceptorModeHandler::mouseMoveEvent(QGraphicsSceneMouseEvent *event, int clickTimeElapsed)
155 QPointF mousePos = event->scenePos();
156 QPointF mousePrevPos = event->lastScenePos();
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;
167 if (event->buttons() == Qt::LeftButton)
170 bool shift = event->modifiers() & Qt::ShiftModifier;
171 float dx = mousePos.x() - mousePrevPos.x();
172 float dy = mousePos.y() - mousePrevPos.y();
175 if (canProcessHeavyTask && d_draggedObject.ref() && d_draggedObject.ref() != d_draggedObject.ref()->getPageBelonging())
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());
182 if (d_cursor->getDropTarget() && d_cursor->getDropTarget() != obj)
184 getController()->unselectCellObject(this, d_cursor->getDropTarget());
185 getController()->selectCellObject(this, cell->getVComponent());
187 if (obj && obj != obj->getPageBelonging() && obj->getPageBelonging() == d_draggedObject.ref()->getPageBelonging())
189 getController()->selectCellObject(this, obj, true);
190 d_cursor->setDropTarget(obj);
194 d_cursor->setDropTarget(NULL);
198 switch(getScene()->getPersMode())
200 case DCScene::DCV_PERSMODE_NAVIGATION:
201 if (d_draggedObject.ref() && d_draggedObject.ref()->getPageBelonging() && d_draggedObject.ref() != d_draggedObject.ref()->getPageBelonging())
204 getView()->toObjectCoordinateXZ(mousePos.x(), mousePos.y(), d_draggedObject.ref()->getPageBelonging(), &pageX, &pageZ);
206 if (d_draggedObject.ref()->dragging(pageX, 0, pageZ, false))
208 DCGLWidget::singleton()->setCursor(Qt::OpenHandCursor);
209 getView()->requestRedraw(false);
214 getController()->rotateScene(this, dy / 5.0, dx / 5.0);
218 getController()->translateBrowsModeScene(this, dx, dy);
222 case DCScene::DCV_PERSMODE_PAGEEDIT:
223 if (d_draggedObject.ref() && d_draggedObject.ref()->getPageBelonging())
225 if (d_draggedObject.ref() == d_draggedObject.ref()->getPageBelonging())
227 getController()->translateEditModeScene(this, dx, dy);
232 getView()->toObjectCoordinateXZ(mousePos.x(), mousePos.y(), d_draggedObject.ref()->getPageBelonging(), &pageX, &pageZ);
233 if (d_draggedObject.ref()->dragging(pageX, 0, pageZ, false))
235 DCGLWidget::singleton()->setCursor(Qt::OpenHandCursor);
236 getView()->requestRedraw(false);
247 void DCVTerminalFromReceptorModeHandler::mouseReleaseEvent(QGraphicsSceneMouseEvent *event, bool wasDrag)
249 bool shift = event->modifiers() & Qt::ShiftModifier;
250 QPointF mousePos = event->scenePos();
252 if (d_draggedObject.ref() && d_draggedObject.ref()->getPageBelonging())
255 getView()->toObjectCoordinateXZ(mousePos.x(), mousePos.y(), d_draggedObject.ref()->getPageBelonging(), &pageX, &pageZ);
256 d_draggedObject.ref()->endDrag(pageX, 0, pageZ, d_inResigingDrag);
259 switch(getScene()->getPersMode())
261 case DCScene::DCV_PERSMODE_NAVIGATION:
263 DCVCPage *page = NULL;
264 if (d_draggedObject.ref())
266 page = d_draggedObject.ref()->getPageBelonging();
271 if (d_cursor->getDropTarget())
273 getController()->doCommandCommitAddAxonTerminal(this, d_cursor->getDropTarget()->getOwnerCell(), d_editReceptor);
280 getController()->selectPage(this, page, shift);
281 d_cursor->changePageBelonging(page);
285 getController()->unselectPageAll(this);
291 case DCScene::DCV_PERSMODE_PAGEEDIT:
294 if (d_cursor->getDropTarget())
296 getController()->doCommandCommitAddAxonTerminal(this, d_cursor->getDropTarget()->getOwnerCell(), d_editReceptor);
303 getScene()->updateVisiblity();
304 getView()->requestRedraw(true);
308 void DCVTerminalFromReceptorModeHandler::wheelEvent(QGraphicsSceneWheelEvent *event)
310 if (event->isAccepted()) return;
312 getController()->changeSceneScale(this, getScene()->getScale() + event->delta()/5);
317 void DCVTerminalFromReceptorModeHandler::keyPressEvent(QKeyEvent *event)
322 void DCVTerminalFromReceptorModeHandler::keyReleaseEvent(QKeyEvent *event)
327 void DCVTerminalFromReceptorModeHandler::showContextMenu(const QPoint &pos)
332 void DCVTerminalFromReceptorModeHandler::selectedPageChanged(const void *requester)
334 if (requester == this)
337 QList<DCVCPage*> pages = getScene()->getSelectedPages();
338 if (pages.length() == 0)
341 if (d_cursor->getPageBelonging() != pages.at(0))
342 d_cursor->changePageBelonging(pages.at(0));