📄 matrixmover.cpp
字号:
if (element) { timeT diffTime = element->getViewAbsoluteTime() - m_currentElement->getViewAbsoluteTime(); int newX = getSnapGrid().getRulerScale()-> getXForTime(newTime + diffTime); if (newX < 0) newX = 0; int newY = int(element->getLayoutY() + diffY); if (newY < 0) newY = 0; if (newY > maxY) newY = maxY; element->setLayoutX(newX); element->setLayoutY(newY); m_currentStaff->positionElement(element); } } if (newPitch != m_lastPlayedPitch) { long velocity = m_mParentView->getCurrentVelocity(); m_currentElement->event()->get<Int>(BaseProperties::VELOCITY, velocity); m_mParentView->playNote(m_currentStaff->getSegment(), newPitch, velocity); m_lastPlayedPitch = newPitch; } m_mParentView->canvas()->update(); return RosegardenCanvasView::FollowHorizontal | RosegardenCanvasView::FollowVertical;}void MatrixMover::handleMouseRelease(timeT newTime, int newPitch, QMouseEvent *e){ MATRIX_DEBUG << "MatrixMover::handleMouseRelease() - newPitch = " << newPitch << endl; if (!m_currentElement || !m_currentStaff) return; if (newPitch > MatrixVLayout::maxMIDIPitch) newPitch = MatrixVLayout::maxMIDIPitch; if (newPitch < 0) newPitch = 0; if (e) newTime = getDragTime(e, newTime); using BaseProperties::PITCH; timeT diffTime = newTime - m_currentElement->getViewAbsoluteTime(); int diffPitch = 0; if (m_currentElement->event()->has(PITCH)) { diffPitch = newPitch - m_currentElement->event()->get<Int>(PITCH); } EventSelection *selection = m_mParentView->getCurrentSelection(); if ((diffTime == 0 && diffPitch == 0) || selection->getAddedEvents() == 0) { for (size_t i = 0; i < m_duplicateElements.size(); ++i) { delete m_duplicateElements[i]->event(); delete m_duplicateElements[i]; } m_duplicateElements.clear(); m_mParentView->canvas()->update(); m_currentElement = 0; return; } if (newPitch != m_lastPlayedPitch) { long velocity = m_mParentView->getCurrentVelocity(); m_currentElement->event()->get<Int>(BaseProperties::VELOCITY, velocity); m_mParentView->playNote(m_currentStaff->getSegment(), newPitch, velocity); m_lastPlayedPitch = newPitch; } QString commandLabel; if (m_quickCopy) { if (selection->getAddedEvents() < 2) { commandLabel = i18n("Copy and Move Event"); } else { commandLabel = i18n("Copy and Move Events"); } } else { if (selection->getAddedEvents() < 2) { commandLabel = i18n("Move Event"); } else { commandLabel = i18n("Move Events"); } } KMacroCommand *macro = new KMacroCommand(commandLabel); EventSelection::eventcontainer::iterator it = selection->getSegmentEvents().begin(); Segment &segment = m_currentStaff->getSegment(); EventSelection *newSelection = new EventSelection(segment); timeT normalizeStart = selection->getStartTime(); timeT normalizeEnd = selection->getEndTime(); if (m_quickCopy) { for (size_t i = 0; i < m_duplicateElements.size(); ++i) { timeT time = m_duplicateElements[i]->getViewAbsoluteTime(); timeT endTime = time + m_duplicateElements[i]->getViewDuration(); if (time < normalizeStart) normalizeStart = time; if (endTime > normalizeEnd) normalizeEnd = endTime; macro->addCommand(new MatrixInsertionCommand (segment, time, endTime, m_duplicateElements[i]->event())); delete m_duplicateElements[i]->event(); delete m_duplicateElements[i]; } m_duplicateElements.clear(); m_quickCopy = false; } for (; it != selection->getSegmentEvents().end(); it++) { timeT newTime = (*it)->getAbsoluteTime() + diffTime; int newPitch = 60; if ((*it)->has(PITCH)) { newPitch = (*it)->get<Int>(PITCH) + diffPitch; } Event *newEvent = 0; if (newTime < segment.getStartTime()) { newTime = segment.getStartTime(); } if (newTime + (*it)->getDuration() >= segment.getEndMarkerTime()) { timeT limit = getSnapGrid().snapTime (segment.getEndMarkerTime() - 1, SnapGrid::SnapLeft); if (newTime > limit) newTime = limit; timeT newDuration = std::min ((*it)->getDuration(), segment.getEndMarkerTime() - newTime); newEvent = new Event(**it, newTime, newDuration); } else { newEvent = new Event(**it, newTime); } newEvent->set<Int>(BaseProperties::PITCH, newPitch); macro->addCommand(new MatrixModifyCommand(segment, (*it), newEvent, true, false)); newSelection->addEvent(newEvent); } normalizeStart = std::min(normalizeStart, newSelection->getStartTime()); normalizeEnd = std::max(normalizeEnd, newSelection->getEndTime()); macro->addCommand(new NormalizeRestsCommand(segment, normalizeStart, normalizeEnd)); m_mParentView->setCurrentSelection(0, false, false); m_mParentView->addCommandToHistory(macro); m_mParentView->setCurrentSelection(newSelection, false, false); m_mParentView->canvas()->update(); m_currentElement = 0; setBasicContextHelp();}void MatrixMover::ready(){ connect(m_parentView->getCanvasView(), SIGNAL(contentsMoving (int, int)), this, SLOT(slotMatrixScrolled(int, int))); connect(this, SIGNAL(hoveredOverNoteChanged(int, bool, timeT)), m_mParentView, SLOT(slotHoveredOverNoteChanged(int, bool, timeT))); m_mParentView->setCanvasCursor(Qt::sizeAllCursor); setBasicContextHelp();}void MatrixMover::stow(){ disconnect(m_parentView->getCanvasView(), SIGNAL(contentsMoving (int, int)), this, SLOT(slotMatrixScrolled(int, int))); disconnect(this, SIGNAL(hoveredOverNoteChanged(int, bool, timeT)), m_mParentView, SLOT(slotHoveredOverNoteChanged(int, bool, timeT)));}void MatrixMover::slotMatrixScrolled(int newX, int newY){ if (!m_currentElement) return ; QPoint newP1(newX, newY), oldP1(m_parentView->getCanvasView()->contentsX(), m_parentView->getCanvasView()->contentsY()); QPoint offset = newP1 - oldP1; offset = m_mParentView->inverseMapPoint(offset); QPoint p(m_currentElement->getCanvasX(), m_currentElement->getCanvasY()); p += offset; timeT newTime = getSnapGrid().snapX(p.x()); int newPitch = m_currentStaff->getHeightAtCanvasCoords(p.x(), p.y()); handleMouseMove(newTime, newPitch, 0);}void MatrixMover::setBasicContextHelp(bool ctrlPressed){ EventSelection *selection = m_mParentView->getCurrentSelection(); if (!selection || selection->getAddedEvents() < 2) { if (!ctrlPressed) { setContextHelp(i18n("Click and drag to move a note; hold Ctrl as well to copy it")); } else { setContextHelp(i18n("Click and drag to copy a note")); } } else { if (!ctrlPressed) { setContextHelp(i18n("Click and drag to move selected notes; hold Ctrl as well to copy")); } else { setContextHelp(i18n("Click and drag to copy selected notes")); } }}const QString MatrixMover::ToolName = "mover";}#include "MatrixMover.moc"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -