void
SetTriggerSegmentDefaultTimeAdjustCommand::unexecute()
{
    TriggerSegmentRec *rec = m_composition->getTriggerSegmentRec(m_id);
    if (!rec)
        return ;
    rec->setDefaultTimeAdjust(m_oldDefaultTimeAdjust);
}
void
DeleteTriggerSegmentCommand::execute()
{
    TriggerSegmentRec *rec = m_composition->getTriggerSegmentRec(m_id);
    if (!rec)
        return ;
    m_segment = rec->getSegment();
    m_basePitch = rec->getBasePitch();
    m_baseVelocity = rec->getBaseVelocity();
    m_composition->detachTriggerSegment(m_id);
    m_detached = true;
}
// modifySegment just deals with the effects on the segment that
// selection was in, the trigger segment is managed separately by
// m_paster.
void
CutToTriggerSegmentCommand::modifySegment(void)
{
    using namespace BaseProperties;

    // This is only possible the first time, before selection's
    // contents evaporate due to the erasing.  This requires that we
    // use bruteForceRedo = true.
    EraseCommand::eraseInSegment(m_selection);

    /* Adapted from InsertTriggerNoteCommand */

    const TriggerSegmentId id = m_paster.getTriggerSegmentId();
    // Insert via a model event, so as to apply the note style.
    // This is a subset of the work done by NoteInsertionCommand

    Event *e = new Event(Note::EventType, m_time, m_duration);

    // Set the properties that every tied note has.
    // makeThisNoteViable will give these to every tied note.
    e->set<Int>(PITCH, m_paster.getBasePitch());
    e->set<Int>(VELOCITY, m_paster.getBaseVelocity());
    e->set<Bool>(TRIGGER_EXPAND, true);

    if (m_noteStyle != NoteStyleFactory::DefaultStyle) {
        e->set<String>(NotationProperties::NOTE_STYLE, qstrtostr(m_noteStyle));
    }

    Segment &s(getSegment());
    Segment::iterator i = s.insert(e);
    SegmentNotationHelper(s).makeThisNoteViable(i);
    s.normalizeRests(m_time, m_time + m_duration);

    // Now set the properties that only the trigger note has.
    e->set<Int>(TRIGGER_SEGMENT_ID, id);
    e->set<Bool>(TRIGGER_SEGMENT_RETUNE, m_retune);
    e->set<String>(TRIGGER_SEGMENT_ADJUST_TIMES, m_timeAdjust);

    if (m_mark != Marks::NoMark) {
        Marks::addMark(*e, m_mark, true);
    }


    // Update references to this new ornament
    TriggerSegmentRec *rec =
        s.getComposition()->getTriggerSegmentRec(id);

    if (rec)
    {
        rec->updateReferences();
    }
}
void
AddTriggerSegmentCommand::execute()
{
    if (m_segment) {
        m_composition->addTriggerSegment(m_segment, m_id, m_basePitch, m_baseVelocity);
    } else {
        m_segment = new Segment();
        m_segment->setEndMarkerTime(m_duration);
        TriggerSegmentRec *rec = m_composition->addTriggerSegment
                                 (m_segment, m_basePitch, m_baseVelocity);
        if (rec)
            m_id = rec->getId();
    }
    m_detached = false;
}
void
InsertTriggerNoteCommand::modifySegment()
{
    // Insert via a model event, so as to apply the note style.
    // This is a subset of the work done by NoteInsertionCommand

    Event *e = new Event(Note::EventType, m_time, m_duration);

    // Could 
    e->set<Int>(PITCH, m_pitch);
    e->set<Int>(VELOCITY, m_velocity);
    e->set<Bool>(TRIGGER_EXPAND, true);

    if (m_noteStyle != NoteStyleFactory::DefaultStyle) {
        e->set<String>(NotationProperties::NOTE_STYLE, qstrtostr(m_noteStyle));
    }

    Segment &s(getSegment());
    Segment::iterator i = s.insert(e);
    SegmentNotationHelper(s).makeThisNoteViable(i);
    s.normalizeRests(m_time, m_time + m_duration);

    // Add these properties only after the note is possibly
    // split-and-tied.
    e->set<Int>(TRIGGER_SEGMENT_ID, m_id);
    e->set<Bool>(TRIGGER_SEGMENT_RETUNE, m_retune);
    e->set<String>(TRIGGER_SEGMENT_ADJUST_TIMES, m_timeAdjust);

    if (m_mark != Marks::NoMark) {
        Marks::addMark(*e, m_mark, true);
    }

    
    TriggerSegmentRec *rec =
        s.getComposition()->getTriggerSegmentRec(m_id);

    if (rec)
        rec->updateReferences();
}