void SceneViewer::keyReleaseEvent(QKeyEvent *event) { if (m_freezedStatus != NO_FREEZED) return; TTool *tool = TApp::instance()->getCurrentTool()->getTool(); if (!tool || !tool->isEnabled()) return; tool->setViewer(this); int key = event->key(); if (key == Qt::Key_Shift || key == Qt::Key_Control || key == Qt::Key_Alt || key == Qt::Key_AltGr) { if (key == Qt::Key_Shift) modifiers &= ~Qt::ShiftModifier; else if (key == Qt::Key_Control) modifiers &= ~Qt::ControlModifier; else if (key == Qt::Key_Alt || key == Qt::Key_AltGr) modifiers &= ~Qt::AltModifier; // quando l'utente preme shift/ctrl ecc. alcuni tool (es. pinch) devono // cambiare subito la forma del cursore, senza aspettare il prossimo move TMouseEvent toonzEvent; initToonzEvent(toonzEvent, event); toonzEvent.m_pos = TPoint(m_lastMousePos.x(), height() - 1 - m_lastMousePos.y()); TPointD pos = tool->getMatrix().inv() * winToWorld(m_lastMousePos); TObjectHandle *objHandle = TApp::instance()->getCurrentObject(); if (tool->getToolType() & TTool::LevelTool && !objHandle->isSpline()) { pos.x /= m_dpiScale.x; pos.y /= m_dpiScale.y; } tool->mouseMove(pos, toonzEvent); setToolCursor(this, tool->getCursorId()); } if (tool->getName() == T_Type) event->accept(); else event->ignore(); }
void SceneViewer::keyPressEvent(QKeyEvent *event) { if (m_freezedStatus != NO_FREEZED) return; int key = event->key(); if (changeFrameSkippingHolds(event)) { return; } if ((event->modifiers() & Qt::ShiftModifier) && (key == Qt::Key_Down || key == Qt::Key_Up)) { } TTool *tool = TApp::instance()->getCurrentTool()->getTool(); if (!tool) return; bool isTextToolActive = tool->getName() == T_Type && tool->isActive(); if (!isTextToolActive && ViewerZoomer(this).exec(event)) return; if (!isTextToolActive && SceneViewerShortcutReceiver(this).exec(event)) return; if (!tool->isEnabled()) return; tool->setViewer(this); // If this object is child of Viewer or ComboViewer // (m_isStyleShortcutSelective = true), // then consider about shortcut for the current style selection. if (m_isStyleShortcutSwitchable && Preferences::instance()->isUseNumpadForSwitchingStylesEnabled() && (!isTextToolActive) && (event->modifiers() == Qt::NoModifier || event->modifiers() == Qt::KeypadModifier) && ((Qt::Key_0 <= key && key <= Qt::Key_9) || key == Qt::Key_Tab || key == Qt::Key_Backtab)) { event->ignore(); return; } if (key == Qt::Key_Shift) modifiers |= Qt::SHIFT; else if (key == Qt::Key_Control) modifiers |= Qt::CTRL; else if (key == Qt::Key_Alt || key == Qt::Key_AltGr) modifiers |= Qt::ALT; if (key == Qt::Key_Shift || key == Qt::Key_Control || key == Qt::Key_Alt || key == Qt::Key_AltGr) { // quando l'utente preme shift/ctrl ecc. alcuni tool (es. pinch) devono // cambiare subito la forma del cursore, senza aspettare il prossimo move TMouseEvent toonzEvent; initToonzEvent(toonzEvent, event); toonzEvent.m_pos = TPoint(m_lastMousePos.x(), height() - 1 - m_lastMousePos.y()); TPointD pos = tool->getMatrix().inv() * winToWorld(m_lastMousePos); TObjectHandle *objHandle = TApp::instance()->getCurrentObject(); if (tool->getToolType() & TTool::LevelTool && !objHandle->isSpline()) { pos.x /= m_dpiScale.x; pos.y /= m_dpiScale.y; } tool->mouseMove(pos, toonzEvent); setToolCursor(this, tool->getCursorId()); } bool shiftButton = QApplication::keyboardModifiers() == Qt::ShiftModifier; TUINT32 flags = 0; TPoint pos; if (key == Qt::Key_Shift) flags = TwConsts::TK_ShiftPressed; else if (key == Qt::Key_Control) flags = TwConsts::TK_CtrlPressed; else if (key == Qt::Key_Alt) flags = TwConsts::TK_AltPressed; else if (key == Qt::Key_CapsLock) flags = TwConsts::TK_CapsLock; else if (key == Qt::Key_Backspace) key = TwConsts::TK_Backspace; else if (key == Qt::Key_Return) key = TwConsts::TK_Return; else if (key == Qt::Key_Left && !shiftButton) key = TwConsts::TK_LeftArrow; else if (key == Qt::Key_Right && !shiftButton) key = TwConsts::TK_RightArrow; else if (key == Qt::Key_Up && !shiftButton) key = TwConsts::TK_UpArrow; else if (key == Qt::Key_Down && !shiftButton) key = TwConsts::TK_DownArrow; else if (key == Qt::Key_Left && shiftButton) key = TwConsts::TK_ShiftLeftArrow; else if (key == Qt::Key_Right && shiftButton) key = TwConsts::TK_ShiftRightArrow; else if (key == Qt::Key_Up && shiftButton) key = TwConsts::TK_ShiftUpArrow; else if (key == Qt::Key_Down && shiftButton) key = TwConsts::TK_ShiftDownArrow; else if (key == Qt::Key_Home) key = TwConsts::TK_Home; else if (key == Qt::Key_End) key = TwConsts::TK_End; else if (key == Qt::Key_PageUp) key = TwConsts::TK_PageUp; else if (key == Qt::Key_PageDown) key = TwConsts::TK_PageDown; else if (key == Qt::Key_Insert) key = TwConsts::TK_Insert; else if (key == Qt::Key_Delete) key = TwConsts::TK_Delete; else if (key == Qt::Key_Escape) key = TwConsts::TK_Esc; else if (key == Qt::Key_F1) key = TwConsts::TK_F1; else if (key == Qt::Key_F2) key = TwConsts::TK_F2; else if (key == Qt::Key_F3) key = TwConsts::TK_F3; else if (key == Qt::Key_F4) key = TwConsts::TK_F4; else if (key == Qt::Key_F5) key = TwConsts::TK_F5; else if (key == Qt::Key_F6) key = TwConsts::TK_F6; else if (key == Qt::Key_F7) key = TwConsts::TK_F7; else if (key == Qt::Key_F8) key = TwConsts::TK_F8; else if (key == Qt::Key_F9) key = TwConsts::TK_F9; else if (key == Qt::Key_F10) key = TwConsts::TK_F10; else if (key == Qt::Key_F11) key = TwConsts::TK_F11; else if (key == Qt::Key_F12) key = TwConsts::TK_F12; else if (key == Qt::Key_Menu || key == Qt::Key_Meta) return; bool ret = false; if (tool) // && m_toolEnabled) { QString text = event->text(); if ((event->modifiers() & Qt::ShiftModifier)) text.toUpper(); std::wstring unicodeChar = text.toStdWString(); ret = tool->keyDown(key, unicodeChar, flags, pos); // per il textTool if (ret) { update(); return; } ret = tool->keyDown(key, flags, pos); // per gli altri tool } if (!ret) { TFrameHandle *fh = TApp::instance()->getCurrentFrame(); if (key == TwConsts::TK_UpArrow) fh->prevFrame(); else if (key == TwConsts::TK_DownArrow) fh->nextFrame(); else if (key == TwConsts::TK_Home) fh->firstFrame(); else if (key == TwConsts::TK_End) fh->lastFrame(); } update(); // TODO: devo accettare l'evento? }
void SceneViewer::mouseMoveEvent(QMouseEvent *event) { if (m_freezedStatus != NO_FREEZED) return; QPoint curPos = event->pos(); bool cursorSet = false; m_lastMousePos = curPos; if (m_editPreviewSubCamera) { if (!PreviewSubCameraManager::instance()->mouseMoveEvent(this, event)) return; } // if the "compare with snapshot" mode is activated, change the mouse cursor // on the border handle if (m_visualSettings.m_doCompare) { if (abs(curPos.x() - width() * m_compareSettings.m_compareX) < 20) { cursorSet = true; setToolCursor(this, ToolCursor::ScaleHCursor); } else if (abs((height() - curPos.y()) - height() * m_compareSettings.m_compareY) < 20) { cursorSet = true; setToolCursor(this, ToolCursor::ScaleVCursor); } } // control of the border handle when the "compare with snapshot" mode is // activated if (m_compareSettings.m_dragCompareX || m_compareSettings.m_dragCompareY) { if (m_compareSettings.m_dragCompareX) m_compareSettings.m_compareX += ((double)(curPos.x() - m_pos.x())) / width(); else if (m_compareSettings.m_dragCompareY) m_compareSettings.m_compareY -= ((double)(curPos.y() - m_pos.y())) / height(); m_compareSettings.m_compareX = tcrop(m_compareSettings.m_compareX, 0.0, 1.0); m_compareSettings.m_compareY = tcrop(m_compareSettings.m_compareY, 0.0, 1.0); update(); m_pos = curPos; } else if (m_mouseButton == Qt::NoButton || m_mouseButton == Qt::LeftButton) { if (is3DView() && m_current3DDevice != NONE && m_mouseButton == Qt::LeftButton) return; else if (is3DView() && m_mouseButton == Qt::NoButton) { TRectD rect = TRectD(TPointD(m_topRasterPos.x, m_topRasterPos.y), TDimensionD(20, 20)); if (rect.contains(TPointD(curPos.x(), curPos.y()))) m_current3DDevice = TOP_3D; else { rect = TRectD(TPointD(m_sideRasterPos.x, m_sideRasterPos.y), TDimensionD(20, 20)); if (rect.contains(TPointD(curPos.x(), curPos.y()))) { if (m_phi3D > 0) m_current3DDevice = SIDE_RIGHT_3D; else m_current3DDevice = SIDE_LEFT_3D; } else m_current3DDevice = NONE; } if (m_current3DDevice != NONE) { cursorSet = true; setToolCursor(this, ToolCursor::CURSOR_ARROW); } } // if the middle mouse button is pressed while dragging, then do panning Qt::MouseButtons mousebuttons; mousebuttons = event->buttons(); if (mousebuttons & Qt::MidButton) { // panning QPoint p = curPos - m_pos; if (m_pos == QPoint(0, 0) && p.manhattanLength() > 300) return; panQt(curPos - m_pos); m_pos = curPos; return; } TTool *tool = TApp::instance()->getCurrentTool()->getTool(); if (!tool || !tool->isEnabled()) { m_tabletEvent = false; return; } tool->setViewer(this); TMouseEvent toonzEvent; initToonzEvent(toonzEvent, event, height(), m_pressure, m_tabletEvent, false); TPointD worldPos = winToWorld(curPos); TPointD pos = tool->getMatrix().inv() * worldPos; if (m_locator) { m_locator->onChangeViewAff(worldPos); } TObjectHandle *objHandle = TApp::instance()->getCurrentObject(); if (tool->getToolType() & TTool::LevelTool && !objHandle->isSpline()) { pos.x /= m_dpiScale.x; pos.y /= m_dpiScale.y; } // qDebug() << "mouseMoveEvent. " << (m_tabletEvent?"tablet":"mouse") // << " pressure=" << m_pressure << " mouseButton=" << m_mouseButton // << " buttonClicked=" << m_buttonClicked; if ((m_tabletEvent && m_pressure > 0) || m_mouseButton == Qt::LeftButton) { // sometimes the mousePressedEvent is postponed to a wrong mouse move // event! if (m_buttonClicked) tool->leftButtonDrag(pos, toonzEvent); } else if (m_pressure == 0) { tool->mouseMove(pos, toonzEvent); // m_tabletEvent=false; } if (!cursorSet) setToolCursor(this, tool->getCursorId()); m_pos = curPos; } else if (m_mouseButton == Qt::MidButton) { if ((event->buttons() & Qt::MidButton) == 0) m_mouseButton = Qt::NoButton; else // panning panQt(curPos - m_pos); m_pos = curPos; return; } }