MacroCommand *StandardWorktimeDialog::buildCommand() { //debugPlan; KUndo2MagicString n = kundo2_i18n("Modify Estimate Conversions"); MacroCommand *cmd = 0; if (m_original->year() != dia->inYear()) { if (cmd == 0) cmd = new MacroCommand(n); cmd->addCommand(new ModifyStandardWorktimeYearCmd(m_original, m_original->year(), dia->inYear())); } if (m_original->month() != dia->inMonth()) { if (cmd == 0) cmd = new MacroCommand(n); cmd->addCommand(new ModifyStandardWorktimeMonthCmd(m_original, m_original->month(), dia->inMonth())); } if (m_original->week() != dia->inWeek()) { if (cmd == 0) cmd = new MacroCommand(n); cmd->addCommand(new ModifyStandardWorktimeWeekCmd(m_original, m_original->week(), dia->inWeek())); } if (m_original->day() != dia->inDay()) { if (cmd == 0) cmd = new MacroCommand(n); cmd->addCommand(new ModifyStandardWorktimeDayCmd(m_original, m_original->day(), dia->inDay())); } return cmd; }
void MacroCommand::save() { ParameterGrp::handle hGrp = App::GetApplication().GetParameterGroupByPath("User parameter:BaseApp/Macro")->GetGroup("Macros"); hGrp->Clear(); std::vector<Command*> macros = Application::Instance->commandManager().getGroupCommands("Macros"); if ( macros.size() > 0 ) { for (std::vector<Command*>::iterator it = macros.begin(); it!=macros.end(); ++it ) { MacroCommand* macro = (MacroCommand*)(*it); ParameterGrp::handle hMacro = hGrp->GetGroup(macro->getName()); hMacro->SetASCII( "Script", macro->getScriptName () ); hMacro->SetASCII( "Menu", macro->getMenuText () ); hMacro->SetASCII( "Tooltip", macro->getToolTipText() ); hMacro->SetASCII( "WhatsThis", macro->getWhatsThis () ); hMacro->SetASCII( "Statustip", macro->getStatusTip () ); hMacro->SetASCII( "Pixmap", macro->getPixmap () ); hMacro->SetASCII( "Accel", macro->getAccel () ); } } }
void MacroCommand::load() { ParameterGrp::handle hGrp = App::GetApplication().GetParameterGroupByPath("User parameter:BaseApp/Macro"); if (hGrp->HasGroup("Macros")) { hGrp = hGrp->GetGroup("Macros"); std::vector<Base::Reference<ParameterGrp> > macros = hGrp->GetGroups(); for (std::vector<Base::Reference<ParameterGrp> >::iterator it = macros.begin(); it!=macros.end(); ++it ) { MacroCommand* macro = new MacroCommand((*it)->GetGroupName()); macro->setScriptName ( (*it)->GetASCII( "Script" ).c_str() ); macro->setMenuText ( (*it)->GetASCII( "Menu" ).c_str() ); macro->setToolTipText ( (*it)->GetASCII( "Tooltip" ).c_str() ); macro->setWhatsThis ( (*it)->GetASCII( "WhatsThis" ).c_str() ); macro->setStatusTip ( (*it)->GetASCII( "Statustip" ).c_str() ); if ((*it)->GetASCII("Pixmap", "nix") != "nix") macro->setPixmap ( (*it)->GetASCII( "Pixmap" ).c_str() ); macro->setAccel ( (*it)->GetASCII( "Accel",0 ).c_str() ); Application::Instance->commandManager().addCommand( macro ); } } }
MacroCommand *AddRelationDialog::buildCommand() { MacroCommand *c = new MacroCommand( kundo2_i18n("Add task dependency") ); c->addCommand( new AddRelationCmd(m_project, m_relation ) ); m_deleterelation = false; // don't delete return c; }
void SegmentTransposeCommand::processSegment(Segment &segment, bool changeKey, int steps, int semitones, bool transposeSegmentBack) { MacroCommand * macroCommand = this; // TODO delete it somewhere. EventSelection * wholeSegment = new EventSelection(segment, segment.getStartTime(), segment.getEndMarkerTime()); macroCommand->addCommand(new TransposeCommand (semitones, steps, *wholeSegment)); // Key insertion can do transposition, but a C4 to D becomes a D4, while // a C4 to G becomes a G3. Because we let the user specify an explicit number // of octaves to move the notes up/down, we add the keys without transposing // and handle the transposition seperately: if (changeKey) { Rosegarden::Key initialKey = segment.getKeyAtTime(segment.getStartTime()); Rosegarden::Key newInitialKey = initialKey.transpose(semitones, steps); EventSelection::eventcontainer::iterator i; //std::list<KeyInsertionCommand*> commands; for (i = wholeSegment->getSegmentEvents().begin(); i != wholeSegment->getSegmentEvents().end(); ++i) { // transpose key if ((*i)->isa(Rosegarden::Key::EventType)) { Rosegarden::Key trKey = (Rosegarden::Key (**i)).transpose(semitones, steps); //commands.push_front macroCommand->addCommand (new KeyInsertionCommand (segment, (*i)->getAbsoluteTime(), trKey, false, false, false, true)); } } std::list<KeyInsertionCommand*>::iterator ci; //for (ci=commands.begin(); ci!=commands.end(); ci++) //{ // commandHistory->addCommand(*ci); //} KeyInsertionCommand *firstKeyCommand = new KeyInsertionCommand (segment, segment.getStartTime(), newInitialKey, false, false, false, true); //commandHistory->addCommand(firstKeyCommand); macroCommand->addCommand(firstKeyCommand); } if (transposeSegmentBack) { // Transpose segment in opposite direction int newTranspose = segment.getTranspose() - semitones; macroCommand->addCommand(new SegmentChangeTransposeCommand(newTranspose, &segment)); } }
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(); }
int SegmentSelector::mouseMoveEvent(QMouseEvent *e) { // No need to propagate. e->accept(); QPoint pos = m_canvas->viewportToContents(e->pos()); m_lastMousePos = pos; // If no buttons are pressed, update the context help and bail. // Note: Mouse tracking must be on for this to work. See // QWidget::setMouseTracking(). if (e->buttons() == Qt::NoButton) { setContextHelpFor(pos, e->modifiers()); return RosegardenScrollView::NoFollow; } // If another tool has taken over, delegate. if (m_dispatchTool) return m_dispatchTool->mouseMoveEvent(e); // We only handle the left button. The middle button is handled by // the dispatch tool (segment pencil) or ignored. if (e->buttons() != Qt::LeftButton) return RosegardenScrollView::NoFollow; // If we aren't moving anything, rubber band. if (!getChangingSegment()) { m_canvas->drawSelectionRectPos2(pos); m_canvas->getModel()->selectionHasChanged(); return RosegardenScrollView::FollowHorizontal | RosegardenScrollView::FollowVertical; } // Moving // If the segment that was clicked on isn't selected, bail. if (!m_canvas->getModel()->isSelected(getChangingSegment()->getSegment())) return RosegardenScrollView::NoFollow; const int dx = pos.x() - m_clickPoint.x(); const int dy = pos.y() - m_clickPoint.y(); const int inertiaDistance = 8; // If we've not already exceeded the inertia distance, and we // still haven't, bail. if (!m_passedInertiaEdge && abs(dx) < inertiaDistance && abs(dy) < inertiaDistance) { return RosegardenScrollView::NoFollow; } m_passedInertiaEdge = true; m_canvas->viewport()->setCursor(Qt::SizeAllCursor); #if 0 // ??? Moving to mouseReleaseEvent(). if (m_segmentCopyMode && !m_segmentQuickCopyDone) { // Make copies of the original Segment(s). These copies will // take the place of the originals as the user drags the // the originals to a new location. MacroCommand *macroCommand = 0; if (m_segmentCopyingAsLink) { macroCommand = new MacroCommand( SegmentQuickLinkCommand::getGlobalName()); } else { macroCommand = new MacroCommand( SegmentQuickCopyCommand::getGlobalName()); } SegmentSelection selectedItems = m_canvas->getSelectedSegments(); // for each selected segment for (SegmentSelection::iterator it = selectedItems.begin(); it != selectedItems.end(); ++it) { Segment *segment = *it; Command *command = 0; if (m_segmentCopyingAsLink) { command = new SegmentQuickLinkCommand(segment); } else { // if it's a link, copy as link if (segment->isTrulyLinked()) command = new SegmentQuickLinkCommand(segment); else // copy as a non-link segment command = new SegmentQuickCopyCommand(segment); } macroCommand->addCommand(command); } CommandHistory::getInstance()->addCommand(macroCommand); m_canvas->update(); // Make sure we don't do it again. m_segmentQuickCopyDone = true; } #endif setSnapTime(e, SnapGrid::SnapToBeat); // start move on selected items only once if (!m_selectionMoveStarted) { m_selectionMoveStarted = true; m_canvas->getModel()->startChangeSelection( m_segmentCopyMode ? CompositionModelImpl::ChangeCopy : CompositionModelImpl::ChangeMove); // The call to startChangeSelection() generates a new changing segment. // Get it. ChangingSegmentPtr newChangingSegment = m_canvas->getModel()->findChangingSegment( getChangingSegment()->getSegment()); if (newChangingSegment) { // Toss the local "changing" segment since it isn't going to // be moving at all. Swap it for the same changing segment in // CompositionModelImpl. That one *will* be moving and can be // used to drive the guides. setChangingSegment(newChangingSegment); } } // Display help for the Shift key. setContextHelpFor(pos, e->modifiers()); Composition &comp = m_doc->getComposition(); const int startDragTrackPos = m_canvas->grid().getYBin(m_clickPoint.y()); const int currentTrackPos = m_canvas->grid().getYBin(pos.y()); const int trackDiff = currentTrackPos - startDragTrackPos; CompositionModelImpl::ChangingSegmentSet &changingSegments = m_canvas->getModel()->getChangingSegments(); // For each changing segment for (CompositionModelImpl::ChangingSegmentSet::iterator it = changingSegments.begin(); it != changingSegments.end(); ++it) { ChangingSegmentPtr changingSegment = *it; const timeT newStartTime = m_canvas->grid().snapX( changingSegment->savedRect().x() + dx); const int newX = lround( m_canvas->grid().getRulerScale()->getXForTime(newStartTime)); int newTrackPos = m_canvas->grid().getYBin( changingSegment->savedRect().y()) + trackDiff; // Limit to [0, comp.getNbTracks()-1]. if (newTrackPos < 0) newTrackPos = 0; if (newTrackPos > static_cast<int>(comp.getNbTracks()) - 1) newTrackPos = comp.getNbTracks() - 1; const int newY = m_canvas->grid().getYBinCoordinate(newTrackPos); changingSegment->moveTo(newX, newY); m_changeMade = true; } if (m_changeMade) { // Make sure the segments are redrawn. // Note: The update() call below doesn't cause the segments to be // redrawn. It just updates from the cache. m_canvas->slotUpdateAll(); } // Guides const int guideX = getChangingSegment()->rect().x(); const int guideY = getChangingSegment()->rect().y(); m_canvas->drawGuides(guideX, guideY); // Text Float const timeT guideTime = m_canvas->grid().snapX(guideX); RealTime time = comp.getElapsedRealTime(guideTime); QString msecs; msecs.sprintf("%03d", time.msec()); int bar; int beat; int fraction; int remainder; comp.getMusicalTimeForAbsoluteTime(guideTime, bar, beat, fraction, remainder); QString posString = QString("%1.%2s (%3, %4, %5)"). arg(time.sec).arg(msecs).arg(bar + 1).arg(beat).arg(fraction); m_canvas->drawTextFloat(guideX + 10, guideY - 30, posString); m_canvas->update(); return RosegardenScrollView::FollowHorizontal | RosegardenScrollView::FollowVertical; }
void SegmentSelector::mouseReleaseEvent(QMouseEvent *e) { // We only care about the left and middle mouse buttons. if (e->button() != Qt::LeftButton && e->button() != Qt::MidButton) return; // No need to propagate. e->accept(); QPoint pos = m_canvas->viewportToContents(e->pos()); // If another tool (SegmentPencil or SegmentResizer) has taken // over, delegate. if (m_dispatchTool) { m_dispatchTool->mouseReleaseEvent(e); m_dispatchTool->stow(); // Forget about the tool. // Note that this is not a memory leak. There is only one instance // of each tool stored in BaseToolBox::m_tools. m_dispatchTool = 0; // Back to this tool. ready(); return; } // We only handle the left button. The middle button is handled by // the dispatch tool (segment pencil) or ignored. if (e->button() != Qt::LeftButton) return; // The left button has been released. m_canvas->hideGuides(); m_canvas->hideTextFloat(); // If rubber band mode if (!getChangingSegment()) { m_canvas->hideSelectionRect(); m_canvas->getModel()->finalizeSelectionRect(); m_canvas->getModel()->selectionHasChanged(); return; } m_canvas->viewport()->setCursor(Qt::ArrowCursor); if (m_canvas->getModel()->isSelected(getChangingSegment()->getSegment())) { if (m_changeMade) { MacroCommand *macroCommand = 0; CompositionModelImpl::ChangingSegmentSet &changingSegments = m_canvas->getModel()->getChangingSegments(); if (m_segmentCopyMode) { if (m_segmentCopyingAsLink) { macroCommand = new MacroCommand( tr("Copy %n Segment(s) as link(s)", "", changingSegments.size())); } else { macroCommand = new MacroCommand( tr("Copy %n Segment(s)", "", changingSegments.size())); } } else { macroCommand = new MacroCommand( tr("Move %n Segment(s)", "", changingSegments.size())); } if (m_segmentCopyMode) { // Make copies of the original Segment(s). These copies will // take the place of the originals. SegmentSelection selectedItems = m_canvas->getSelectedSegments(); // for each selected segment for (SegmentSelection::iterator it = selectedItems.begin(); it != selectedItems.end(); ++it) { Segment *segment = *it; Command *command = 0; if (m_segmentCopyingAsLink) { command = new SegmentQuickLinkCommand(segment); } else { // if it's a link, copy as link if (segment->isTrulyLinked()) command = new SegmentQuickLinkCommand(segment); else // copy as a non-link segment command = new SegmentQuickCopyCommand(segment); } macroCommand->addCommand(command); } } const int startDragTrackPos = m_canvas->grid().getYBin(m_clickPoint.y()); const int currentTrackPos = m_canvas->grid().getYBin(pos.y()); const int trackDiff = currentTrackPos - startDragTrackPos; Composition &comp = m_doc->getComposition(); SegmentReconfigureCommand *segmentReconfigureCommand = new SegmentReconfigureCommand("", &comp); // For each changing segment, add the segment to the // SegmentReconfigureCommand. for (CompositionModelImpl::ChangingSegmentSet::iterator it = changingSegments.begin(); it != changingSegments.end(); ++it) { ChangingSegmentPtr changingSegment = *it; Segment *segment = changingSegment->getSegment(); TrackId origTrackId = segment->getTrack(); int newTrackPos = comp.getTrackPositionById(origTrackId) + trackDiff; // Limit to [0, comp.getNbTracks()-1] if (newTrackPos < 0) newTrackPos = 0; if (newTrackPos > static_cast<int>(comp.getNbTracks()) - 1) newTrackPos = comp.getNbTracks() - 1; Track *newTrack = comp.getTrackByPosition(newTrackPos); int newTrackId = origTrackId; if (newTrack) newTrackId = newTrack->getId(); timeT startTime = changingSegment->getStartTime(m_canvas->grid()); // endTime = startTime + segment duration // We absolutely don't want to snap the end time to // the grid. We want it to remain exactly the same as // it was, but relative to the new start time. timeT endTime = startTime + segment->getEndMarkerTime(false) - segment->getStartTime(); segmentReconfigureCommand->addSegment( segment, startTime, endTime, newTrackId); } macroCommand->addCommand(segmentReconfigureCommand); CommandHistory::getInstance()->addCommand(macroCommand); m_canvas->update(); } m_canvas->getModel()->endChange(); m_canvas->slotUpdateAll(); } // Get ready for the next button press. m_segmentQuickCopyDone = false; m_changeMade = false; m_selectionMoveStarted = false; setChangingSegment(ChangingSegmentPtr()); setContextHelpFor(pos); }
MacroCommand *AddRelationDialog::buildCommand() { MacroCommand *c = new MacroCommand( i18n("Add Relation") ); c->addCommand( new AddRelationCmd(m_project, m_relation ) ); return c; }
void ControllerEventsRuler::addControlLine(float x1, float y1, float x2, float y2, bool eraseExistingControllers) { std::cout << "ControllerEventsRuler::addControlLine()"; clearSelectedItems(); // get a timeT for one end point of our line timeT originTime = m_rulerScale->getTimeForX(x1); // get a timeT for the other end point of our line timeT destinationTime = m_rulerScale->getTimeForX(x2); // get a value for one end point of our line long originValue = yToValue(y1); // get a value for the other end point long destinationValue = yToValue(y2); if (originTime == destinationTime || originValue == destinationValue) return; // If the "anchor point" was to the right of the newly clicked destination // point, we're drawing a line from right to left. We simply swap origin // for destination and calculate all lines as drawn from left to right, for // convenience and sanity. if (originTime > destinationTime) { timeT swapTime = originTime; originTime = destinationTime; destinationTime = swapTime; long swapValue = originValue; originValue = destinationValue; destinationValue = swapValue; } // save a list of existing events that occur within the span of the new line // for later deletion, if desired std::vector<Event*> eventsToClear; if (eraseExistingControllers) { for (Segment::iterator si = m_segment->begin(); si != m_segment->end(); ++si) { timeT t = (*si)->getNotationAbsoluteTime(); if (t >= originTime && t <= destinationTime) { eventsToClear.push_back(*si); } } } // rise and run long rise = destinationValue - originValue; timeT run = destinationTime - originTime; std::cout << "Drawing a line from origin time: " << originTime << " to " << destinationTime << " rising from: " << originValue << " to " << destinationValue << " with a rise of: " << rise << " and run of: " << run << std::endl; // avoid divide by 0 potential, rise is always at least 1 if (rise == 0) rise = 1; // are we rising or falling? bool rising = (rise > 0); // always calculate step on a positive value for rise, and make sure it's at // least 1 float step = run / (float)(rising ? rise : rise * -1); // Trying this with pitch bend with a rise approaching the maximum over a // span of around four bars generated over 15,000 pitch bend events! That's // super duper fine resolution, but it's too much for anything to handle. // Let's try to do some sensible thinning without getting too complicated... // bool isPitchBend = (m_controller->getType() == Rosegarden::PitchBend::EventType); int thinningHackCounter = 1; long intermediateValue = originValue; long controllerNumber = 0; if (m_controller) { controllerNumber = m_controller->getControllerValue(); } else { std::cout << "No controller number set. Time to panic! Line drawing aborted." << std::endl; return; } MacroCommand *macro = new MacroCommand(tr("Insert Line of Controllers")); bool failsafe = false; // if we're clearing existing events, add that to the macro command for (std::vector<Event*>::iterator ei = eventsToClear.begin(); ei != eventsToClear.end(); ++ei) { // if the event was a controller or pitch bend, and it is on this ruler, // add it to the list if (((*ei)->isa(Controller::EventType) || (*ei)->isa(PitchBend::EventType)) && isOnThisRuler(*ei)) { bool collapseRests = true; macro->addCommand(new EraseEventCommand(*m_segment, *ei, collapseRests)); } } if (macro->haveCommands()) { CommandHistory::getInstance()->addCommand(macro); macro = new MacroCommand(tr("Insert Line of Controllers")); } for (float i = originTime; i <= destinationTime; i += step) { if (failsafe) continue; if (rising) intermediateValue++; else intermediateValue--; if (rising && intermediateValue > destinationValue) failsafe = true; else if (!rising && intermediateValue < destinationValue) failsafe = true; // std::cout << "creating event at time: " << i << " of value: " << intermediateValue << std::endl; // continue; Event *controllerEvent = new Event(m_controller->getType(), (timeT) i); if (m_controller->getType() == Rosegarden::Controller::EventType) { controllerEvent->set<Rosegarden::Int>(Rosegarden::Controller::VALUE, intermediateValue); controllerEvent->set<Rosegarden::Int>(Rosegarden::Controller::NUMBER, controllerNumber); } else if (m_controller->getType() == Rosegarden::PitchBend::EventType) { // always set the first and last events, then only set every 25th, // 50th, and 75th event for pitch bend if (thinningHackCounter++ > 100) thinningHackCounter = 1; if (thinningHackCounter != 25 && thinningHackCounter != 50 && thinningHackCounter != 75 && i != originTime && i != destinationTime) continue; std::cout << "intermediate value: " << intermediateValue << std::endl; // Convert to PitchBend MSB/LSB int lsb = intermediateValue & 0x7f; int msb = (intermediateValue >> 7) & 0x7f; controllerEvent->set<Rosegarden::Int>(Rosegarden::PitchBend::MSB, msb); controllerEvent->set<Rosegarden::Int>(Rosegarden::PitchBend::LSB, lsb); } if (failsafe) std::cout << "intermediate value: " << intermediateValue << " exceeded target: " << destinationValue << std::endl; macro->addCommand(new EventInsertionCommand (*m_segment, controllerEvent)); } m_moddingSegment = true; CommandHistory::getInstance()->addCommand(macro); m_moddingSegment = false; // How else to re-initialize and bring things into view? I'm missing // something, but this works... init(); }
void MatrixResizer::handleMouseRelease(const MatrixMouseEvent *e) { if (!e || !m_currentElement || !m_currentViewSegment) return; // snap in the closest direction timeT snapTime = e->snappedLeftTime; if (e->snappedRightTime - e->time < e->time - e->snappedLeftTime) { snapTime = e->snappedRightTime; } timeT newDuration = snapTime - m_currentElement->getViewAbsoluteTime(); timeT durationDiff = newDuration - m_currentElement->getViewDuration(); EventSelection *selection = m_scene->getSelection(); if (!selection || selection->getAddedEvents() == 0) return; QString commandLabel = tr("Resize Event"); if (selection->getAddedEvents() > 1) commandLabel = tr("Resize 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(); for (; it != selection->getSegmentEvents().end(); ++it) { timeT t = (*it)->getAbsoluteTime(); timeT d = (*it)->getDuration(); MATRIX_DEBUG << "MatrixResizer::handleMouseRelease - " << "Time = " << t << ", Duration = " << d << endl; d = d + durationDiff; if (d < 0) { t = t + d; d = -d; } else if (d == 0) { d = getSnapGrid()->getSnapTime(t); } if (t + d > segment.getEndMarkerTime()) { d = segment.getEndMarkerTime() - t; if (d <= 0) { d = segment.getEndMarkerTime(); t = d - getSnapGrid()->getSnapTime(t); } } Event *newEvent = new Event(**it, t, d); macro->addCommand(new MatrixModifyCommand(segment, *it, newEvent, false, 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->update(); m_currentElement = 0; setBasicContextHelp(); }
MacroCommand *RequestResourcesPanel::buildCommand() { Task *t = m_view->task(); if ( t == 0 ) { return 0; } MacroCommand *cmd = new MacroCommand( i18nc( "(qtundo-format)", "Modify resource allocations" ) ); /*Project *p = */m_view->project(); const QMap<const Resource*, ResourceRequest*> &rmap = m_view->resourceCache(); // First remove all that should be removed for( QMap<const Resource*, ResourceRequest*>::const_iterator rit = rmap.constBegin(); rit != rmap.constEnd(); ++rit ) { if ( rit.value()->units() == 0 ) { ResourceRequest *rr = t->requests().find( rit.key() ); if ( rr ) { cmd->addCommand( new RemoveResourceRequestCmd( rr->parent(), rr ) ); } } } QMap<const ResourceGroup*, ResourceGroupRequest*> groups; // Add/modify const QMap<const ResourceGroup*, ResourceGroupRequest*> &gmap = m_view->groupCache(); for( QMap<const ResourceGroup*, ResourceGroupRequest*>::const_iterator git = gmap.constBegin(); git != gmap.constEnd(); ++git ) { ResourceGroupRequest *gr = t->requests().find( git.key() ); if ( gr == 0 ) { if ( git.value()->units() > 0 ) { gr = new ResourceGroupRequest( const_cast<ResourceGroup*>( git.key() ), git.value()->units() ); cmd->addCommand( new AddResourceGroupRequestCmd( *t, gr ) ); groups[ git.key() ] = gr; } // else nothing } else { cmd->addCommand( new ModifyResourceGroupRequestUnitsCmd( gr, gr->units(), git.value()->units() ) ); } } for( QMap<const Resource*, ResourceRequest*>::const_iterator rit = rmap.constBegin(); rit != rmap.constEnd(); ++rit ) { Resource *resource = const_cast<Resource*>( rit.key() ); ResourceGroup *group = resource->parentGroup(); if ( rit.value()->units() > 0 ) { ResourceRequest *rr = t->requests().find( resource ); if ( rr == 0 ) { ResourceGroupRequest *gr = t->requests().find( group ); if ( gr == 0 ) { if ( groups.contains( group ) ) { gr = groups[ group ]; } else { gr = new ResourceGroupRequest( group, 0 ); groups[ group ] = gr; cmd->addCommand( new AddResourceGroupRequestCmd( *t, gr ) ); } } ResourceRequest *rr = new ResourceRequest( resource, rit.value()->units() ); rr->setRequiredResources( rit.value()->requiredResources() ); cmd->addCommand( new AddResourceRequestCmd( gr, rr ) ); } else { if ( rit.value()->units() != rr->units() ) { cmd->addCommand( new ModifyResourceRequestUnitsCmd( rr, rr->units(), rit.value()->units() ) ); } if ( rit.value()->requiredResources() != rr->requiredResources() ) { cmd->addCommand( new ModifyResourceRequestRequiredCmd( rr, rit.value()->requiredResources() ) ); } } } } if ( cmd->isEmpty() ) { delete cmd; return 0; } return cmd; }
void ControlRuler::updateSegment() { // Bring the segment up to date with the ControlRuler's items // A number of different actions take place here: // 1) m_eventSelection is empty // 2) m_eventSelection has events // a) Events in the selection have been modified in value only // b) Events in the selection have moved in time // // Either run through the ruler's EventSelection, updating from each item // or, if there isn't one, go through m_selectedItems timeT start,end; // bool segmentModified = false; QString commandLabel = "Adjust control/property"; MacroCommand *macro = new MacroCommand(commandLabel); // Find the extent of the selected items float xmin=FLT_MAX,xmax=-1.0; // EventSelection::addEvent adds timeT(1) to its extentt for zero duration events so need to mimic this here timeT durationAdd = 0; for (ControlItemList::iterator it = m_selectedItems.begin(); it != m_selectedItems.end(); ++it) { if ((*it)->xStart() < xmin) xmin = (*it)->xStart(); if ((*it)->xEnd() > xmax) { xmax = (*it)->xEnd(); if ((*it)->xEnd() == (*it)->xStart()) durationAdd = 1; else durationAdd = 0; } } start = getRulerScale()->getTimeForX(xmin); end = getRulerScale()->getTimeForX(xmax)+durationAdd; if (m_eventSelection->getAddedEvents() == 0) { // We do not have a valid set of selected events to update if (m_selectedItems.size() == 0) { // There are no selected items, nothing to update return; } // Events will be added by the controlItem->updateSegment methods commandLabel = "Add control"; macro->setName(commandLabel); // segmentModified = true; } else { // Check for movement in time here and delete events if necessary if (start != m_eventSelection->getStartTime() || end != m_eventSelection->getEndTime()) { commandLabel = "Move control"; macro->setName(commandLabel); // Get the limits of the change for undo start = std::min(start,m_eventSelection->getStartTime()); end = std::max(end,m_eventSelection->getEndTime()); // segmentModified = true; } } // Add change command to macro // ControlChangeCommand calls each selected items updateSegment method // Note that updateSegment deletes and renews the event whether it has moved or not macro->addCommand(new ControlChangeCommand(m_selectedItems, *m_segment, start, end)); CommandHistory::getInstance()->addCommand(macro); updateSelection(); }
void EditFunctions::okClicked() { QValueList<MetaDataBase::Function> functionList = MetaDataBase::functionList( formWindow ); QString n = tr( "Add/Remove functions of '%1'" ).arg( formWindow->name() ); QPtrList<Command> commands; QValueList<MetaDataBase::Function>::Iterator fit; if ( !functionList.isEmpty() ) { for ( fit = functionList.begin(); fit != functionList.end(); ++fit ) { bool functionFound = FALSE; QValueList<FunctItem>::Iterator it = functList.begin(); for ( ; it != functList.end(); ++it ) { if ( MetaDataBase::normalizeFunction( (*it).oldName ) == MetaDataBase::normalizeFunction( (*fit).function ) ) { functionFound = TRUE; break; } } if ( !functionFound ) commands.append( new RemoveFunctionCommand( tr( "Remove function" ), formWindow, (*fit).function, (*fit).specifier, (*fit).access, (*fit).type, formWindow->project()->language(), (*fit).returnType ) ); } } bool invalidFunctions = FALSE; QValueList<FunctItem> invalidItems; if ( !functList.isEmpty() ) { QStrList lst; QValueList<FunctItem>::Iterator it = functList.begin(); for ( ; it != functList.end(); ++it ) { MetaDataBase::Function function; function.function = (*it).newName; function.returnType = (*it).retTyp; function.specifier = (*it).spec; function.access = (*it).access; function.type = (*it).type; function.language = formWindow->project()->language(); if ( function.returnType.isEmpty() ) function.returnType = "void"; QString s = function.function; s = s.simplifyWhiteSpace(); bool startNum = s[ 0 ] >= '0' && s[ 0 ] <= '9'; bool noParens = s.contains( '(' ) != 1 || s.contains( ')' ) != 1; bool illegalSpace = s.find( ' ' ) != -1 && s.find( ' ' ) < s.find( '(' ); if ( startNum || noParens || illegalSpace || lst.find( function.function ) != -1 ) { invalidFunctions = TRUE; invalidItems.append( (*it) ); continue; } bool functionFound = FALSE; for ( fit = functionList.begin(); fit != functionList.end(); ++fit ) { if ( MetaDataBase::normalizeFunction( (*fit).function ) == MetaDataBase::normalizeFunction( (*it).oldName ) ) { functionFound = TRUE; break; } } if ( !functionFound ) commands.append( new AddFunctionCommand( tr( "Add function" ), formWindow, function.function, function.specifier, function.access, function.type, formWindow->project()->language(), function.returnType ) ); if ( MetaDataBase::normalizeFunction( (*it).newName ) != MetaDataBase::normalizeFunction( (*it).oldName ) || (*it).spec != (*it).oldSpec || (*it).access != (*it).oldAccess || (*it).type != (*it).oldType || (*it).retTyp != (*it).oldRetTyp ) { QString normalizedOldName = MetaDataBase::normalizeFunction( (*it).oldName ); if ((*it).oldName.endsWith("const")) // make sure we get the 'const' when we remove the old name normalizedOldName += " const"; commands.append( new ChangeFunctionAttribCommand( tr( "Change function attributes" ), formWindow, function, normalizedOldName, (*it).oldSpec, (*it).oldAccess, (*it).oldType, formWindow->project()->language(), (*it).oldRetTyp ) ); } lst.append( function.function ); } } if ( invalidFunctions ) { if ( QMessageBox::information( this, tr( "Edit Functions" ), tr( "Some syntactically incorrect functions have been defined.\n" "Remove these functions?" ), tr( "&Yes" ), tr( "&No" ) ) == 0 ) { QValueList<FunctItem>::Iterator it = functList.begin(); while ( it != functList.end() ) { bool found = FALSE; QValueList<FunctItem>::Iterator vit = invalidItems.begin(); for ( ; vit != invalidItems.end(); ++vit ) { if ( (*vit).newName == (*it).newName ) { invalidItems.remove( vit ); found = TRUE; break; } } if ( found ) { int delId = (*it).id; it = functList.remove( it ); QMap<QListViewItem*, int>::Iterator fit = functionIds.begin(); while ( fit != functionIds.end() ) { if ( *fit == delId ) { QListViewItem *litem = fit.key(); functionIds.remove( fit ); delete litem; if ( functionListView->currentItem() ) functionListView->setSelected( functionListView->currentItem(), TRUE ); currentItemChanged( functionListView->currentItem() ); break; } ++fit; } } else ++it; } if ( functionListView->firstChild() ) { functionListView->setCurrentItem( functionListView->firstChild() ); functionListView->setSelected( functionListView->firstChild(), TRUE ); } } formWindow->mainWindow()->objectHierarchy()->updateFormDefinitionView(); return; } if ( !commands.isEmpty() ) { MacroCommand *cmd = new MacroCommand( n, formWindow, commands ); formWindow->commandHistory()->addCommand( cmd ); cmd->execute(); } formWindow->mainWindow()->objectHierarchy()->updateFormDefinitionView(); accept(); }