⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 matrixmover.cpp

📁 LINUX下的混音软件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        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 + -