CollapseRestsCommand::CollapseRestsCommand (EventSelection &selection) : BasicCommand(getGlobalName(), selection.getSegment(), selection.getStartTime(), selection.getEndTime()) { // nothing else }
CutAndCloseCommand::CutAndCloseCommand(EventSelection &selection, Clipboard *clipboard) : MacroCommand(getGlobalName()) { addCommand(new CutCommand(selection, clipboard)); addCommand(new CloseCommand(&selection.getSegment(), selection.getEndTime(), selection.getStartTime())); }
BasicSelectionCommand::BasicSelectionCommand(const QString &name, EventSelection &selection, bool bruteForceRedo) : BasicCommand(name, selection.getSegment(), selection.getStartTime(), selection.getEndTime(), bruteForceRedo) { // nothing }
CopyCommand::CopyCommand(EventSelection &selection, Clipboard *clipboard) : NamedCommand(getGlobalName()), m_targetClipboard(clipboard) { m_sourceClipboard = new Clipboard; m_savedClipboard = 0; std::string label = selection.getSegment().getLabel(); m_sourceClipboard->newSegment(&selection)->setLabel( appendLabel(label, qstrtostr(tr("(excerpt)")))); }
EventUnquantizeCommand::EventUnquantizeCommand( EventSelection &selection, Quantizer *quantizer) : BasicCommand(tr("Unquantize Events"), selection.getSegment(), selection.getStartTime(), selection.getEndTime(), true), // bruteForceRedo m_quantizer(quantizer), m_selection(&selection) { // nothing else }
AddIndicationCommand::AddIndicationCommand(std::string indicationType, EventSelection &selection) : BasicCommand(getGlobalName(indicationType), selection.getSegment(), std::min(selection.getStartTime(), selection.getNotationStartTime()), std::max(selection.getEndTime(), selection.getNotationEndTime())), m_indicationType(indicationType), m_indicationStart(selection.getNotationStartTime()), m_indicationDuration(selection.getTotalNotationDuration()), m_lastInsertedEvent(0) { if (!canExecute()) { throw CommandFailed //!!! need to use text from trunk/src/gui/editors/notation/NotationView.cpp (but this requires an informal human-readable version of the indication name) (qstrtostr(tr("Can't add identical overlapping indications"))); } }
void MatrixSelector::setViewCurrentSelection(bool always) { if (always) m_previousCollisions.clear(); EventSelection* selection = 0; bool changed = getSelection(selection); if (!changed) { delete selection; return; } if (m_selectionToMerge && selection && m_selectionToMerge->getSegment() == selection->getSegment()) { selection->addFromSelection(m_selectionToMerge); m_scene->setSelection(selection, true); } else if (!m_selectionToMerge) { m_scene->setSelection(selection, true); } }
void MatrixMover::handleMouseRelease(const MatrixMouseEvent *e) { if (!e) return; MATRIX_DEBUG << "MatrixMover::handleMouseRelease() - newPitch = " << e->pitch << endl; if (!m_currentElement || !m_currentViewSegment) return; timeT newTime = m_currentElement->getViewAbsoluteTime() + (e->snappedLeftTime - m_clickSnappedLeftTime); int newPitch = e->pitch; if (newPitch > 127) newPitch = 127; if (newPitch < 0) newPitch = 0; // get a basic pitch difference calculation comparing the current element's // pitch to the pitch the mouse was released at (see note in // handleMouseMove) 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_scene->getSelection(); // factor in transpose to adjust the height calculation long pitchOffset = selection->getSegment().getTranspose(); diffPitch += (pitchOffset * -1); 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_currentElement = 0; return; } if (newPitch != m_lastPlayedPitch) { long velocity = m_widget->getCurrentVelocity(); m_currentElement->event()->get<Int>(BaseProperties::VELOCITY, velocity); m_scene->playNote(m_currentViewSegment->getSegment(), newPitch + (pitchOffset * -1), velocity); m_lastPlayedPitch = newPitch; } QString commandLabel; if (m_quickCopy) { if (selection->getAddedEvents() < 2) { commandLabel = tr("Copy and Move Event"); } else { commandLabel = tr("Copy and Move Events"); } } else { if (selection->getAddedEvents() < 2) { commandLabel = tr("Move Event"); } else { commandLabel = tr("Move Events"); } } MacroCommand *macro = new MacroCommand(commandLabel); EventSelection::eventcontainer::iterator it = selection->getSegmentEvents().begin(); Segment &segment = m_currentViewSegment->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_scene->setSelection(0, false); CommandHistory::getInstance()->addCommand(macro); m_scene->setSelection(newSelection, false); // m_mParentView->canvas()->update(); m_currentElement = 0; setBasicContextHelp(); }
MatrixTool::FollowMode MatrixMover::handleMouseMove(const MatrixMouseEvent *e) { if (!e) return NoFollow; MATRIX_DEBUG << "MatrixMover::handleMouseMove() snapped time = " << e->snappedLeftTime << endl; setBasicContextHelp(e->modifiers & Qt::ControlModifier); if (!m_currentElement || !m_currentViewSegment) return NoFollow; if (getSnapGrid()->getSnapSetting() != SnapGrid::NoSnap) { setContextHelp(tr("Hold Shift to avoid snapping to beat grid")); } else { clearContextHelp(); } timeT newTime = m_currentElement->getViewAbsoluteTime() + (e->snappedLeftTime - m_clickSnappedLeftTime); int newPitch = e->pitch; emit hoveredOverNoteChanged(newPitch, true, newTime); // get a basic pitch difference calculation comparing the current element's // pitch to the clicked pitch (this does not take the transpose factor into // account, so in a -9 segment, the initial result winds up being 9 // semitones too low) using BaseProperties::PITCH; int diffPitch = 0; if (m_currentElement->event()->has(PITCH)) { diffPitch = newPitch - m_currentElement->event()->get<Int>(PITCH); } EventSelection* selection = m_scene->getSelection(); // factor in transpose to adjust the height calculation long pitchOffset = selection->getSegment().getTranspose(); diffPitch += (pitchOffset * -1); for (EventSelection::eventcontainer::iterator it = selection->getSegmentEvents().begin(); it != selection->getSegmentEvents().end(); ++it) { MatrixElement *element = 0; ViewElementList::iterator vi = m_currentViewSegment->findEvent(*it); if (vi != m_currentViewSegment->getViewElementList()->end()) { element = static_cast<MatrixElement *>(*vi); } if (!element) continue; timeT diffTime = element->getViewAbsoluteTime() - m_currentElement->getViewAbsoluteTime(); int epitch = 0; if (element->event()->has(PITCH)) { epitch = element->event()->get<Int>(PITCH); } element->reconfigure(newTime + diffTime, element->getViewDuration(), epitch + diffPitch); element->setSelected(true); } if (newPitch != m_lastPlayedPitch) { long velocity = m_widget->getCurrentVelocity(); m_currentElement->event()->get<Int>(BaseProperties::VELOCITY, velocity); m_scene->playNote(m_currentViewSegment->getSegment(), newPitch + (pitchOffset * -1), velocity); m_lastPlayedPitch = newPitch; } return FollowMode(FollowHorizontal | FollowVertical); }